初莫M 发表于 2023-9-30 14:04:00

问问代码错在哪了啊

题目是
计算m到n之间所有素数的和,其中 2 <= m <=n <=100

输入格式:
请在这里写输入格式。例如:输入两个正整数

输出格式:

请在这里描述输出格式。例如:输出两个正整数之间的素数和。
我的代码是
#include<stdio.h>
int su(int x)
{
        int z=x;int y;
        for(y=2;y<=z;y++)
        {
                if(z%y==0)break;
                if(z<y) return 0;
                else return z;
        }
}
int main()
{
        int a,b;
        scanf("%d%d",&a,&b);
        int i,t,s=0;
        if(a<b) t=a,a=b,b=t;
        for(i=a;i>=b;i--)
        {
                s=s+su(i);
        }
        printf("%d",s);
}
运行结果大于正确答案 错在哪了啊

isdkz 发表于 2023-9-30 14:04:10

代码中存在以下问题:

1. 函数su中的if(z<y) return 0;应该放在for循环结束后,因为只有在for循环中没有找到y能够整除z时才能判断z是否小于y 。

2. 函数su中的else return z;应该放在for循环结束后,因为只有在for循环中没有找到y能够整除z时才能返回z 。

3. 函数su中的if(z<y) return 0;应该改为if(y<z) return 0; ,因为只有在y小于z时才能判断z是否能够被整除。

4. 函数su中应该添加一个return 1; ,以表示x是素数。

5. 在主函数中,应该将if(a<b) t=a,a=b,b=t;改为if(a>b) t=a,a=b,b=t; ,因为题目要求m <= n 。

修改后的代码如下:

#include<stdio.h>

int su(int x)
{
    int y;
    for(y=2;y<=x;y++)
    {
      if(x%y==0) break;
      if(y<x) continue;
      else return 1;
    }
    return 0;
}

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    int i,t,s=0;
    if(a>b) t=a,a=b,b=t;
    for(i=a;i<=b;i++)
    {
      if(su(i)) s=s+i;
    }
    printf("%d",s);
    return 0;
}

Mike_python小 发表于 2023-9-30 14:04:35

在您的代码中,存在两个问题导致结果错误:

1. su函数中的逻辑问题:在判断一个数是否为素数时,可以利用除了1和该数本身以外不存在其他因子的性质。但是在您的代码中,当z<y时,直接返回0,导致循环提前结束,无法正确判断素数。应该将这部分代码放在循环结束后进行判断。

修改代码如下:

int su(int x)
{
    int z=x;
    for(int y=2;y<=z;y++)
    {
      if(z%y==0)
            break;
      if(z<y)
            return z;
    }
    return 0;
}


2. 循环逻辑问题:在主函数中,遍历从大到小的循环应该使用i>=b的条件,而不是i>=b。否则会导致循环条件错误,无法正确遍历区间。

修改代码如下:

for(i=a;i>=b;i--)
{
    s += su(i);
}


通过以上两个修改,您可以尝试重新运行代码并计算m到n之间所有素数的和。如果问题仍然存在,请提供具体的错误信息或者输出示例,以便进一步帮助您解决问题。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-9-30 14:05:34

你的代码中有一处逻辑错误导致结果错误。问题出在 su() 函数中的返回语句位置不正确。请注意,在循环中检查是否能整除时,应该遍历到 y = z - 1,如果存在能整除的数则直接 return,否则返回 z。

以下是修改后的代码:

#include <stdio.h>

int su(int x) {
    int z = x;
    int y;
    for (y = 2; y < z; y++) {
      if (z % y == 0)
            return 0;
    }
    return z;
}

int main() {
    int a, b;
    scanf("%d%d", &a, &b);
    int i, t, s = 0;
    if (a < b) {
      t = a;
      a = b;
      b = t;
    }
    for (i = a; i >= b; i--) {
      s += su(i);
    }
    printf("%d", s);
    return 0;
}


这个修正后的代码中,su() 函数的逻辑已经修改正确。同时,我还对变量的初始化和交换进行了一些调整,以确保输入的 m 和 n 的大小关系正确。

请注意,在计算素数和时,由于题目要求计算 m 到 n 之间的素数的和,因此在 for 循环中应使用 y < z 来进行判断。

希望对你有帮助!如有任何疑问,请随时提出。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 问问代码错在哪了啊