
素数求法有很多种。。如果不要求时间暴力尝试是可以的。用算法的话个人认为还是用这个方法最快最好,就是把不是素数的数字排除,剩下的就是素数了。这个程序蛮简单的。。你看看能不能理解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语言的判断质数函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)