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;
}
3、下面是我对算法的小小的优化:
就是将 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;
}