#include <stdio.h>
int main()
{
int M, N, i=2, j,count=0,sum=0;
scanf_s("%d%d", &M, &N);
for (j = M; j <= N; j++)//j等于M 然后j++一直到N 这样就把[M,N]里面的所有数都取遍了
{
for (; i <= j - 1; i++)
/*素数 首先得注意1 不是素数。然后i就从2开始取,要是这个数是素数 那么用它自己%i得到的结果一定不为0
所以还有一个前提i不能取到j本身 所以for循环的判断条件是i<=j-1*/
{
if (j % i != 0) {
sum += j;
count++;
}//是素数
}
}
printf("sum=%d count=%d", sum, count);
return 0;
}
[5,40]内 的所有素数求和 然后计算有多少素数 。
理想很丰满 ,但是现实很残酷。
debug一下 可以发现 ,从5开始就卡在那里 一直执行了好几次。
这个时候我发现问题了 ,99不是素数 ,但99%2不等于0,但是我写的这个程序会判定他是素数 。所以要重写一下这个代码。
再次Debug 发现把''j=5'' 作为素数取出后 ,往下再取一个数字的时候,i的值并不是我期望的''2''而是''5''。
所以目标就是 让i的值是2。
可是 运行结果还是不对。
输入5 ,40 。如果结果正确 应该输出sum=192 count=10
但是现在输出的结果是5 和1。
再次debug ,发现X的值在 if语句中改变后,就一直是0 而不是1了,这个问题好像和 上边的I的问题是一样的 。所以可以通过相同的修改方式,改写代码。
OK,代码终于运行通过了 。
#include <stdio.h>
int main()
{
int M, N, i=2, j,count=0,sum=0,X= 1;
scanf_s("%d%d", &M, &N);
for (j = M; j <= N; j++)//j等于M 然后j++一直到N 这样就把[M,N]里面的所有数都取遍了
{
for (; i <= j - 2; i++)/*素数 首先得注意1 不是素数。然后i就从2开始取,要是这个数是素数 那么用它自己%i得到的结果一定不为0
所以还有一个前提i不能取到j本身 所以for循环的判断条件是i<=j-1*/
{
if (j % i== 0) //就像数学中的反证法。要证伪只需要找到一个不符合的,所以只要出现一个不符合的 ,那么它必定不是素数。
{
X = 0;
break;
}
//跳出内循环后 ,到了外循环。本次的j不是素数 ,再往下取一个数字,即j++
//但是要是是素数 ,得有东西把他接住
}//内循环
if (X) {
sum += j;
count++;
}
i = 2;//让i的值重变为2
X = 1;//让X的值重变为1
}
printf("sum=%d count=%d", sum, count);
return 0;
}
所以我觉得 问题就是处在了在最开头定义的变量X和i 上边。
专业的来说,就是作用域没有搞清楚。