基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。
可用以下程序段实现:
voidmain()
{intm,i,k;
printf("pleaseinputanumber:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i if(m%i==0)break; if(i>=k) printf("该数是素数"); else printf("该数不是素数"); } 将其写成一函数,若为素数返回1,不是则返回0 intprime(m%) {inti,k; k=sqrt(m); for(i=2;i if(m%i==0)return0; return1; } 扩展资料: 筛法求素数 一、基本思想 用筛法求素数的基本思想是: 把从1开始的、某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 如有: 12345678910 11121314151617181920 21222324252627282930 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 357911131517192123252729 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为: 2357111317192329 二、C++实现 1、算法一:令A为素数,则A*N(N>1;N为自然数)都不是素数。 #define range 2000 bool IsPrime[range+1]; void set(bool IsPrime[]) { int i,j; for(i=0;i IsPrime[i]=true; IsPrime[0]=IsPrime[1]=false; for(i=2;i { if( IsPrime[i]) { for(j=2*i;jIsPrime[j]=false;}}} 2、 说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。 例如,16=2^4,18=2*3^2,691488=2^5*3^2*7^4等。如果把因式分解中最小质数写在最左边,有16=2^4,18=2*9,691488=2^5*21609,; 换句话说,把合数N写成N=p^k*q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k*q;的方式也是唯一的。 由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除p^2,p^3,p^4,...,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。 因为每个非质数都只被删除一次,可想而知,这个程序的速度一定相当快。依据Gries与Misra的文章,线性的时间,也就是与N成正比的时间就足够了(此时要找出2N的质数)。 代码如下: #include #include using namespace std; int main() { int N; cin>>N; int *Location=new int[N+1]; for(int i=0;i!=N+1;++i) Location[i]=i; Location[1]=0; //筛除部分 int p,q,end; end=sqrt((double)N)+1; for(p=2;p!=end;++p) { if(Location[p]) { for(q=p;p*q { for(int k=p*q;k Location[k]=0; } } } int m=0; for(int i=1;i!=N+1;++i) { if(Location[i]!=0) { cout ++m; } if(m%10==0) cout } cout return 0; } 该代码在VisualStudio2010环境下测试通过。 以上两种算法在小数据下速度几乎相同。 参考资料: