#include <iostream>
#include <memory.h>
#include <cmath>
using namespace std;
int main()
{
long long int n;
cin>>n;
long long int a[n+1];
memset(a,0,sizeof(a)+1);
long long int m = sqrt(n);
for(long long int i = 2; i <= m; i++)
{
if(!a[i])
{
for(long long j = i + i; j <= n; j+=i)
a[j] = 1;
}
}
for(long long int i = 2; i <= n; i++)
if(!a[i])
cout<<i<<"\t";
return 0;
}
优化依据:
一个数的质因子中最多只有一个质因子大于该数的算数平方根。
否则,记A、B是N的两个大于N的算数平方根的质因子,那么有
AB>|sqrt(N)||sqrt(N)|=N≥A*B,矛盾。
所以,在程序中找一个数的质因子或者判断一个数是否是时只需要查到该数的算数平方根即可。