改名字了,2022.2.26之前叫
回到正题,由题可知,题目要求在用户自己输入的定整数M和N区间内求出素数的个数,并且对他们求和。
要想解决编程题目,首先要知道题目问的是什么。 素数一般指质数。 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
简而言之就是一个数字n只能被1和它本身整除(n>1,不包含1本身,即从2开始计数)。
知道了这些就可以往下进行了。
首先我们需要两个变量,用来存放输入的两个定整数,即:
#include
int main()
{
int m,n;
scanf("%d%d",&m,&n);
}
(为了方便了解,下面只写main函数里面的代码。)
由此即可输入两个数字m,和n
其次我们应该可以想到有一个if判断条件,也就是什么时候这个数字可以判断成素数,然后进行求和的这样一个操作:
if()
{
cnt++;
sum+=i;
}
想到这这一句话,就要再创建三个变量i,cnt,sum;
i用来表示一直变化着的数字,也就是从m到n这个区间内遍历的数字,i是一直变化着的,cnt用来计数,记录从m到n这个区间内的素数个数,sum用来求和。
此时我们的代码可以写成这个样子:
sum+=i 意思是sum=sum+i;
即将每次求出来的素数进行累计求和。
接下来我们可以从if入手,既然有了if,那我们就该考虑if()括号里面放入什么判断条件。
我们可以假设一个变量叫isPrime,当isPrime=1时,即为素数。
其次,我们要从m到n进行一个遍历,这样我们才能得到m到n的素数
这个循环的意思是:第一层for循环,先把m的值赋给i,当i<=n时进行下面的语句。这样做的意思是,让 i 这个变量从m到n遍历一遍,确保m到n区间内的整数都能被遍历过,不漏数字。
可以用数轴表示m到n
随后是又重新定义了一个变量K
把2赋值给k,当k i%k==0 当 i 求余k的值是0时,说明 i 将k整除了。 举个例子,10/5=2 余数为0 这个0就是求余后的结果,也可以写成10%2==0; 两个等号的意思是等于,而不是一个等号代表的赋值语句,我以前也会犯这样的错误,如果写成了if(i%k=0) 那语句意思就变成了把0赋值给了 i %k 的结果,那这样 i % k的结果就一直是0,起不到判断的作用了。 这里 i 和k的意思是,i 可以理解为一个从m 到 n 一直增长的一个变量,而 k 从2 开始就是因为素数的定义,素数是大于的1 的整数,并且只能被1和它本身整除,所以k才从2开始。i%k就是为了检验m到n区间内的数(即变量i遍历期间)是否能将k 整除,如果它一直整除,那说明它就不是一个素数,毕竟 当且仅当一个数字被1和它本身整除时才能叫作素数。 感兴趣的同学可以自己逐语句看一下整个过程,这里我用的是VS2019 #define _CRT_SECURE_NO_WARNINGS if (isPrime) { 在vs2019里面如果遇到了scanf返回值被忽略: 可以在代码顶部加上一行: 这样就不会报错了。 知道了要输入两个变量接受值、要用if做出判断:是否是素数,进行求和 和计数、用for循环进行遍历、添加相应的条件,例如:if(i%k==0)进行判断。 有了这些思考,我们再写出一个相关的代码也就不太难了,起码不像我们一开始看到题目毫无思路。 看到问题勤思考,小张和你共成长! 谢谢大家的观看!
#include
int main()
{
int m, n;
int i;
int cnt = 0;
int sum = 0;
scanf("%d%d", &m, &n);
if (m == 1)
m = 2;
for (i = m; i <= n; i++) {
int k;
int isPrime = 1;
for (k = 2; k < i - 1; k++) {
if (i % k == 0) {
isPrime = 0;
break;
}
}
cnt++;
sum += i;
}
}
printf("%d %dn", cnt, sum);
return 0;
}