素数 统计+求和 要我老命

#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 上边。

专业的来说,就是作用域没有搞清楚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值