解题思路:
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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复