欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》
有这么几个方法:
1.对于2-n的每一个数,判断是否为素数,是则输出。
——判断k是否为素数的时候得从 2 到 (int)(sqrt(k))遍历,算法通俗易懂
void OutputAllPrimeNum( int n )
{
for(int i = 2; i <= n; ++i)
{
int t = (int)(sqrt(double(i)));
int flag = 1;
int k = 2;
while(k <= t)
{
if (i % k == 0)
{
flag = 0;
break;
}
++k;
}
if (flag == 1)
{
cout<<i<<"\n";
}
}
}
2.设集合A={x | n>=x >= 2,x∈Z} , B={y |sqrt(n)>= y >= 2,x∈Z}
那么任意的合数N,都能分解为N=x*y 其中x>=y;基于这样的思想,我们将遍历A集合与B集合,扣除那些乘积形式所对应的数,则剩下的数为素数。
void OutputAllPrimeNum( int n )
{
int Prime[MAXNUM];
for(int i = 1; i < n; ++i)
{
Prime[i]=1;
}
int t = (int)(sqrt(double(n)));
for(int i = 2; i <= n; ++i)
{
for(int j = 2; j <= t; ++j)
{
if((i*j) > n)
{
break;
}
Prime[i*j-1]=0;
}
}
for(int i = 0; i < n; ++i)
{
if (Prime[i] == 1)
{
cout<<i+1<<"\n";
}
}
}
3.从2-n中依次除去2的倍数(2除外),3的倍数(3除外),……,n的倍数(n除外)
void OutputAllPrimeNum( int n )
{
int Prime[MAXNUM];
for(int i = 1; i < n; ++i)
{
Prime[i]=1;
}
for(int i = 2; i <= n; ++i)
{
if (Prime[i-1] == 1)
{
cout<<i<<"\n";
}
for(int j = 2*i; j <= n; j += i)
{
Prime[j-1]=0;
}
}
}
欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》