解题思路:
1.先编写主程序,输入m和n,并在主程序中用for循环列举出m到n的所有数;
2.将m到n中每个数调到isprime函数中进行判断,处理,如果那个数是素数,则返回原值进行累加;不是素数,则返回0这个数字进行累加(就等于把不是素数的数略掉了);
3.输出m到n所有数字累加后的值。
注意事项:
这个是拓展知识,把这题弄懂后有兴趣的伙伴可以看一下
这里调用了库函数math,就是为了写出sqrt(开方的指令)在isprime函数的判断中,我用j小于x的开方来做限制条件(参照代码),为什么我不用j小于x的1/2做限制条件呢?
是因为一个数的开方,就是它最大的因数。比如9的开方是3,9的因数是1,3; 25的开方是5,25的因数是1,5。
这样做有什么好处呢?比如如果我们想判断100000是否是素数,用10000的1/2来做限制条件,for语句判断时要执行5000次;而用10000的开方来做限制条件,for语句判断时只用执行100次,相比起来,就节约了很多内存。
参考代码:
#include
#include
int isprime(int x)
{
int j,flag=0;
if(x==1) return 0;//先敲定1不是素数 (因为此判断程序无法正确判断1是不是素数)
for(j=2;j<=sqrt(x);j++)//判断素数
{
if(x%j==0)
{
flag=1;
break;//判断出了此数不为素数,即可跳出循环,节约内存
}
}
if(flag==0) return x;//是素数返回原值
else return 0;//不是素数返回 0
}
int main()
{
int i,s=0,m,n,k;
scanf("%d%d",&m,&n);//输入始末值
for(i=m;i<=n;i++)//m到n
{
k=isprime(i);//将m到n中每个数调到isprime函数中进行判断,处理,并用返回到k中
s+=k;//累加
}
printf("%d",s);
return 0;
}
0.0分
2 人评分
C语言训练-求素数问题 (C语言代码)浏览:960 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:730 |
奖学金 (C++代码)浏览:2008 |
【亲和数】 (C语言代码)浏览:541 |
输出正反三角形 (C语言代码)浏览:794 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:834 |
第三届阿里中间件性能挑战赛-总决赛亚军比赛攻略浏览:1145 |
A+B for Input-Output Practice (I) (C语言代码)浏览:431 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:608 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:621 |