赞
踩
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
解题代码:
#include <stdio.h> #include <math.h> int main(){ int m,n; scanf("%d %d",&m,&n); int i; int count=0,sum=0; for(m;m<=n;m++){ int s; s=sqrt(m); for(i=2;i<=s;i++){ if(m%i==0){ break; } } if(i>s){ if(m==1){ count=count; } else{ sum+=m; count++; } } } printf("%d %d",count,sum); return 0; }
解题思路:
本题视频讲解链接 https://www.bilibili.com/video/BV1cr4y1w79H/
更多PTA题目视频讲解请关注B站(哔哩哔哩):李桥桉
首先,先写C语言的框架:第一行头文件+第4行+第28、29行写上。
下面先屡一下做题思路,题目要求是输入两个数m,n且n>m,
我们要输出m和n之间素数的个数以及这些素数的总和。
首先我们要思考,怎么判断一个数是素数呢?
首先,1不是素数,偶数以及能开方的数都不是素数,偶数2除外。
有3个可以判断素数的办法:
①用X对2—(X-1)之间的数取余,如果满足余数为0则不是素数;
②用X对2— X/2 之间的数取余,如果满足余数为0则不是素数;
③用X对2—根号X之间的数取余,如果满足余数为0则不是素数;
本题我们采用第③种判断方法。
首先,有输入就要调用scanf()函数,%d整型输出,
m和n前面不要忘了加取址符;
随后再把m、n变量,定义到scanf()语句的前面去;
然后从第9行开始看,
for(m;m<=n;m++){
这道题我们要用两个for循环,
最外层for循环是从m到n进行n-m+1次循环,因为有n-m+1个数嘛;
内层for循环是对每个数进行遍历,遍历根号下它本身次,
且每次都要判断该数对2—根号下它本身之间的每个数进行取余,结果是否为0;
如果满足余数为0则不是素数嗷;
于是,我们增加break语句终止当次循环,继续对下个数进行同样遍历;
因为内层for循环,对每个数从2开始进行取余到根号下m结束,
注意,这里的根号下m是向下取整数,
所以,整数1~3之间的数开根号,结果s都是1,
整数4~8之间的数开根号,结果s都是2;
如果i>s了,就可以说明它是一个素数了,
当然1除外,1不是素数,但是题目要求中是可以输入1的,
所以我们在这里要加一个分支,用来判定1和其他素数;
if(m==1){
count=count;
}
如果i>s且m==1成立,那么count不变,不计数;
否则,就对素数进行累加
else{
sum+=m;
count++;
}
下面大家自己运行一下代码叭。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。