求C语言中判断素数的代码!!!!!

2022-03-16 社会 118阅读

基本思想:把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环境下测试通过。

以上两种算法在小数据下速度几乎相同。

参考资料:百度百科-筛法求素数

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com