
建议你百度下“筛选法”
这里定义了一个数组,用到了a[2]到a[100]
本程序给每一个项,a[i]赋予了两个信息,一个是 i 表一个自然数,一个是a[i]的值,值为1表示 i 是素数,值为0表示 i 不是素数
首先,先初始化所有项,令其值为1
i=2时,a[2]=1,2的倍数不是素数,所以令下标是2的倍数的项值为0(这里 if(a[i]) ,相当于把这个数挖掉了,下次就不管了)
i=3时,a[3]=1,3的倍数不是素数,所以令下标是3的倍数的项值为0
i=4时,由于i=2时,把a[4]的值变为了0, if(a[i]) 为假,pass
i=5时,a[5]=1,5的倍数不是素数,所以令下标是5的倍数的项值为0
………………
k=sqrt(m)for(i=2i<=ki++)if(m%i==0) breakif(i>=k+1) { printf(" %d",m)n=n+1由以上程序知,k中存储的是m的开平方根值,用以判断循环的结束。或者改用k=m/2也可以;
break是用来跳出for循环的 m有根(被整除),就不用再判断if 语句了。 i>=k+1成立的话,说明m在2---k的范围内没有根,是素数,则有n+1
由每符合条件一次,n的值加一,可知n用来统计素数个数的。
C语言-寻找素数
附代码:
#include<stdio.h>
#include<math.h>
int main()//原理:设ab=c,a<b,则有a<根号c<b。若设a恒小于根号c,则只需判断a是否为因数
{
int a, b
printf("请按从小到大输入两个素数:")
scanf_s("%d %d", &a, &b)
int n = 0,m=0,sum = 0
double i, j//i是从a到b的待筛选数,j是从2到根号i的除数,要判断j是否为i的因数
for (i = ai <= bi++)
{
m = 0
int c = int(pow(i, 0.5))
for (j = 2j <= cj++)
{
if ((i / j - int(i / j)) == 0.0)
{
m++//m是i被从2到根号i的j除了之后,商为整数,即发现j是i的因数的次数
}
}
if (m==0)
{
printf("找到素数:%d\n", int(i))
n++
sum = sum + i
}
}
printf("大于等于%d,小于等于%d的素数的个数为:%d\n", a, b, n)
printf("它们的和为:%d", sum)
return 0
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)