如果一个自然数n不是质数,设可因式分解为n=pq,这里1<p,q < n ,不失一般性可以设置为p<=q,则p^2<=pq=n,所以p<根号n,要判断一个自然数是否为质数,可以循环1到根号n的整数去除n,如出现了正除,则n不为质数,否则n为质数。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespacee std;
int main(void)
{
int i;
int n;
printf("输入自然数n:");
scanf("%d", $n );
for (i = 2 ; i*i <= n; i++)
{
if(n%i == 0)
{
break;
}
}
if(i*i <= n)
{
cont << n <<"不是质数"<<endl;
}
system("PAUSE");
return 0;
}
sieve 法求质数,下面通过例子说明sieve法,求2~20之间的质数。2~20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2是质数,将2的倍数删掉
2 3 5 7 9 11 13 15 17 19
下一个质数是3,把3的倍数删掉
2 3 5 7 11 13 17 19
下一个质数是5,由于5^2 > 20,所以工作停止,没有删除的就是质数。
但是上面的删除方法可能出现重复删除的问题比如2*3*5*7。
解决方案具体如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAX_SIZE 10000
//找出比p大但是没有被删除的数q
int Next(int sieve[] ,int p)
{
int q = p + 1;
while(q < MAX_SIZE && 0 == sieve[q])
{
q ++;
}
return q;
}
int main(void)
{
int sieve[MAX_SIZE];
int p ,q , i, count = 0;
for(i = 2 ; i < MAX_SIZE ; i++)
{
sieve[i] = 1;
}
for(p = 2 ; p*p <MAX_SIZE ; p = Next(sieve, p))
{
for(q = p; q*p < MAX_SIZE; q = Next(sieve, q))
{
for(i=p*q; i < MAX_SIZE; i *= p)
{
sieve[i] = 0;
}
}
}
for(i = 2 ; i < MAX_SIZE; i ++)
{
if(1 == sieve[i])
{
if(0 == count++%6)
{
printf("\n");
}
printf("%8d",i);
}
}
std::cout << std::endl;
system("PAUSE");
return 0;
}