/*
埃拉托色尼算法 
问题描述:定义一个正整数n,求0-n范围以内的所有质数 
@date 2017-03-06
@author Johnny Zen   
*/ 
#include<iostream>
#include<math.h>
using namespace std;
 
void Eratosthenes(int arrs[],int n){   //arrs暂时设置为空指针,意为在返回目标数组(n范围内的所有质数数组) 
  int sqr,j;
  for(int i=2;i<n;i++){
    arrs[i] = i;     //目标数组初始化 
    sqr = sqrt(i);   //sqr 向下取整   注意:变量名sqr不能取名为sqrt,否则发生关键字冲突,无法编译! 
    for(int k = 2;k<=sqr;k++){   //因为: 在sqrt(i)以后的含小于sqrt(i)倍数关系的数据都已经被清除,剩下的均为质数 
      if(arrs[k]!=0){
        j = pow(k,2);
        while(j<=n){
          arrs[j] = 0;   //因数置0
          j = j+k;       //最为巧妙处: 加法   k*k   k*(k+1)    k*(k+2)  ----k*(k+n) 
        }
      }
    }
  }
  //输出
  for(int i = 2;i<n;i++)
    if(arrs[i]!=0)
      cout<<arrs[i]<<'\t'; 
 
int main(){
  int n,*arrs;
  cout<<"请输入数N:";
  cin>>n;
  arrs = new int[n];  //创建数组 
  
  Eratosthenes(arrs,n);
  
  delete [] arrs; 
  return 0;
05-11 01:15