C语言中如何求质数

C语言中如何求质数,第1张

素数求法有很多种。。如果不要求时间暴力尝试是可以的。用算法的话个人认为还是用这个方法最快最好,就是把不是素数的数字排除,剩下的就是素数了。这个程序蛮简单的。。你看看能不能理解ps:这是我们acm培训的内容,很难得哦

void getprime(int n) //n是素数筛选区间

{

int i , j ;

bool flag[N];

memset ( flag , true , sizeof ( flag ) );

int count = 0; //记录找到的素数个数

for( i=2 ; i<=n ; i++ )

{

if ( flag[i] ) prime[++count]=i; //未被筛掉的就是素数

for( j=1 ; j<=count && iprime[j] <= n ; j++) // prime[j]表示第j个素数

{

flag[ iprime[j] ] = false; //iprime[j]表示被i筛掉的

if( i%prime[j]==0 ) break;

}

}

}

这个算法是一个很快的算法,详细的解释是举例:

i=6的时候,prime[ ]={2,3,5}

第一次6筛掉了62=12,然后判断6%2==2,break;假设循环没有break,接着6即将筛63=18,而事实上18是被9筛掉的。

统一化分析:

不妨设i=pr (p<r),执行break是因为i%p==0,故此时i筛掉的是x1=ip=(pr)p;如果i可以筛掉x1后面的数x2,x2=iq=(pr)q

由x2>x1-》q>p;那么x2可以写成x2=(qr)p,由于 qr>i ,所以x2一定可以被i之后某个数字(qr)筛掉,就不需要用i去筛掉。

有救!有救!

你的思路挺好的,就是编程的时候思路不清晰,没有周全考虑。

这是改后的代码

#include "stdioh"

#include "conioh"

main()

{ int m,n,i,num;

int p[100];

long s;

s=2;

m=1;

n=1;

num=1;

p[1]=2 ;

for (;num<100;num++)/这里的分号应该是你笔误吧O(∩_∩)O/

{for (i=1,n=2;;) /这里n=2而非m估计也是你笔误?/

{m=p[i] ;

if (m>s/2) break;

else if(mn<s) n++;

else if(mn==s) {s++;i=1;n=2;}/这里/

else if(mn>s) {i++;n=2;}/和这里,仔细想一想,当尝试一个新的数字或尝试一个新的质数时,是不是要把计数变量初始化?/

/编程的时候不要想当然,要通盘考虑,每个变量是否都做了妥善的处理/

}

p[num]=s;/你要用质数表,怎么能不记录质数表呢^o^/

printf ("p%d=%ld\n",num,s);

s++;

}

getch();

}

你的程序运用质数表这点很好,但是你的程序还没发挥到最高效率。里边有一些无用的判断和赋值,而且没有利用mod运算,使程序既复杂又低效。

我觉得还是用标准的求质数算法比较好,到处都有,不再说了。

这是我以前写过的判断质数的程序,希望对你有帮助。

#include<stdioh>

int

prime(int

a)

{

int

i;

for(i=2;i<=a/2;i++)

{

if(a%i==0)

break;

}

if(i>a/2)

return

1;

else

return

0;

}

int

main(void)

{

int

x;

printf("请输入一个整数:");

scanf("%d",&x);

if(prime(x))

printf("%d为素数\n",x);

else

printf("%d不是素数\n",x);

}

主要是加了break

以上就是关于C语言中如何求质数全部的内容,包括:C语言中如何求质数、c语言求质数、C语言的判断质数函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9825067.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存