找出大数以内的所有质数(递归算法) #include<iostream> using namespace std; //数组长度 const int n =20000+1; void ShowPrimeNumber(int *, int); int main() { //数组巨大,用动态数组在堆上建立 int *PrimeArray=new int[n]; //数组初始化 for (int i = 0; i < n; i++) { PrimeArray[i] = 1; } PrimeArray[0] = 0; PrimeArray[1] = 0; ShowPrimeNumber( PrimeArray, n); //设置计数器 int count = 0; //打印质数 for (int i = 2; i < n; i++) { if (PrimeArray[i] == 1) { cout << i << " "; count++; if (count % 5 == 0) cout << "\n"; } } cout << endl << count; delete[] PrimeArray; } //先前已经除去除了2的所有偶数,剩下的奇数要么是质数,要么是小于sqrt(a)的质数的倍数 //将1到sqrt(a)的质数在sqrt(a)到n中作为因数,筛除质数的倍数 void ShowPrimeNumber(int *Array, int a) { if (sqrt(a) > 2) //迭代,再调用 ShowPrimeNumber(Array, sqrt(a)); //每次迭代都算 for (int j = 2; j <=sqrt(a); j++) { //根据结果做的调整,使得每个sqrt(a)可以被判断 //且在最后一次a==n时数组不会越界 int x; if (a == n) x = n; else x = a + 1; if (Array[j] == 1) { for (int i = sqrt(a)+1; i < x; i++) { if (i % j == 0) Array[i] = 0; } } } }