1、下面是求1~n的素数的一般方法:
//求1~n的素数一般方法 #include<iostream> using namespace std; int main() { int n,i,j,k=1; bool bo; cin>>n;cout<<"2 "; for (i=3;i<=n;i+=2) { bo=true; for (j=3;j*j<=i;j+=2) if (i%j==0) { bo=false; break; } if (bo) { if (k%10==0) cout<<endl; cout<<i<<' '; k++; } } cout<<endl<<k<<endl; return 0; }
2、对于素数筛选法,具体方法就不阐述了,百度一下就能找到,简单地说就是找到一个素数就把它的倍数标记为非素数。
参考代码:
//素数筛选法求1~n的素数 #include<iostream> using namespace std; #define N 1000000000 bool isprime[N]; int prime[100000]; int main() { int n,i,j,k=1; memset(isprime,true,sizeof(isprime)); cin>>n; int num=0; prime[num++]=2; for (i=3;i<=n;i+=2) { if (isprime[i]) { prime[num++]=i; for (j=i+i;j<=n;j+=i) isprime[j]=false; } } for (i=0;i<num;i++) { cout<<prime[i]<<' '; if ((i+1)%10==0)
cout<<endl; } cout<<endl<<num<<endl; return 0; }
就是将 for ( j=i+i ; j<=n ; j+=i ) 改成 for ( j=i*i ; j<=n ; j+=2*i ) 因为2*i是2的倍数,3*i是3的倍数,5*i是5的倍数~~~~~~,所以 j 直接从 i*i 开始;而每次j 自加2*i ,
这样可以把偶数给排除掉。修改后可以减少一部分的重复赋值。
完整代码:
#include<iostream> using namespace std; #define N 1000000000 bool isprime[N]; int prime[100000]; int main() { int n,i,j,k=1; memset(isprime,true,sizeof(isprime)); cin>>n; int num=0; prime[num++]=2; for (i=3;i<=n;i+=2) { if (isprime[i]) { prime[num++]=i; for (j=i*i;j<=n;j+=2*i) isprime[j]=false; } } for (i=0;i<num;i++) { cout<<prime[i]<<' '; if ((i+1)%10==0) cout<<endl; } cout<<endl<<num<<endl; return 0; }