啊这啧啧啧 发表于 2023-4-16 16:29:05

有个小小的问题想请教一下鱼油们

#include <stdio.h>
#include <math.h>

#define hei 100                //判断y or n的代码不可执行

int main(){
        int num;
        int world;
        int l;//一个数的立方
        int sum=0;//这个立方的奇数和
       
        int m;
        int arr={0};
       
        printf("请输入一个整数:");
        scanf("%d",&num);
        printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n",num);
        printf("是否打印所有句子(y/n):");
        scanf("%c",&world);
       
        if(world=='y'){
        for(int k=3;k<=num;k++){

        for(int i=1;i<=l;i+=2){//小于这个数的所有奇数
          int k=0;
          for(int j=i;j<=l;j+=2){
                  sum+=j;
                  arr=j;
                  k++;
                  if(sum>l){
                          sum=0;
                          k=0;
                          break;
                        }
                  if(sum==l){
                          printf("%d=",l);
                          for(m=0;m<k-1;m++){
                                  printf("%d+",arr);
                                }
                                        printf("%d\n",arr);
                        }
                }
        }
       }
    }
   
        return 0;
}

sfqxx 发表于 2023-4-16 16:29:53

本帖最后由 sfqxx 于 2023-4-16 16:34 编辑

这段代码有以下三个问题:

1. 宏定义的变量`hei` 设定为100,但数组长度以作为数组大小的变量`l`的值未经初始化即使用,因此 `l` 的值不确定。在后面的代码中, `l` 又被用来控制循环次数,这可以导致越界访问造成程序崩溃。

2. 在输入`world` 的值时,`scanf()`函数读取了一个字符,但是该字符并不是用户想要输入的 `y` 或 `n`, 而是按下回车键留下的换行符(`\n`), 因为之前的 `scanf()`函数读取完输入后回车符会留在缓冲区。解决方法如下:
    scanf(" %c",&world);
   在 `%c` 前加一个空格,则 `scanf()` 函数会自动跳过之前留在缓冲区的任何空白符,包括回车符。

3. 在 if 语句中,`for` 循环中的变量 `k` 覆盖了外部的 `k` 变量,导致第一个循环变量失效。解决方法是调整循环变量的名称。

所以,修改这些错误,可以得到以下代码:

#include <stdio.h>
#include <math.h>

#define hei 100

int main() {
    int num;
    int l;
    int sum;
    int m;
    int arr = {0};

    printf("请输入一个整数:");
    scanf("%d", &num);
    getchar(); // 用于读取scanf留下的换行符
    printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
    printf("是否打印所有句子(y/n):");
    char world = getchar();

    if (world == 'y') {
      for (int k = 3; k <= num; k++) {
            l = k * k * k;
            sum = 0;

            for (int i = 1; i <= l; i += 2) {
                int k = 0;

                for (int j = i; j <= l; j += 2) {
                  sum += j;
                  arr = j;
                  k++;

                  if (sum > l) {
                        sum = 0;
                        k = 0;
                        break;
                  }

                  if (sum == l) {
                        printf("%d=", l);
                        for (m = 0; m < k - 1; m++) {
                            printf("%d+", arr);
                        }
                        printf("%d\n", arr);
                  }
                }
            }
      }
    }

    return 0;
}
有用请设置最佳答案

isdkz 发表于 2023-4-16 16:31:22

本帖最后由 isdkz 于 2023-4-16 16:35 编辑

从你提供的代码来看,这个程序是用来验证尼科彻斯定理(Nicolas's theorem)的。尼科彻斯定理指的是每一个大于2的整数n的立方可以表示为n个连续奇数的和。这个程序的主要目的是找到一个数的立方数可以由哪些连续奇数的和表示。

你的代码中存在一些问题,导致判断输入为'y'或'n'的部分无法正常运行。我为你修复了这些问题,并稍微调整了一下代码风格。下面是修改后的代码:

#include <stdio.h>
#include <math.h>

#define hei 100

int main() {
    int num;
    int l;
    int sum;
    int m;
    int arr = {0};

    printf("请输入一个整数:");
    scanf("%d", &num);
    getchar(); // 用于读取scanf留下的换行符
    printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
    printf("是否打印所有句子(y/n):");
    char world = getchar();

    if (world == 'y') {
      for (int k = 3; k <= num; k++) {
            l = k * k * k;
            sum = 0;

            for (int i = 1; i <= l; i += 2) {
                int k = 0;

                for (int j = i; j <= l; j += 2) {
                  sum += j;
                  arr = j;
                  k++;

                  if (sum > l) {
                        sum = 0;
                        k = 0;
                        break;
                  }

                  if (sum == l) {
                        printf("%d=", l);
                        for (m = 0; m < k - 1; m++) {
                            printf("%d+", arr);
                        }
                        printf("%d\n", arr);
                  }
                }
            }
      }
    }

    return 0;
}


现在你的代码应该可以正常运行了。这个程序会要求用户输入一个整数,然后验证尼科彻斯定理对于3到这个整数之间的所有整数是否成立。如果用户选择打印所有句子,程序将输出每个整数立方可以表示为哪些连续奇数的和。

你的代码问题主要在以下几个方面:


[*]在从用户输入num后,没有读取并处理换行符。这导致当你试图读取字符world时,实际上读取到的是上一个输入留下的换行符。为了解决这个问题,我在scanf("%d", &num)后加入了getchar(),用以读取换行符。

[*]你在if (world == 'y')内部的循环中使用了变量k,但在循环内部的另一个循环中又重新定义了一个变量k。这会导致外部循环的k被覆盖,从而产生错误。为了解决这个问题,我将内部循环的k重命名为count。

两手空空儿 发表于 2023-4-16 16:44:58

有一种被GPT统治的感觉...........

sfqxx 发表于 2023-4-16 16:47:16

两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

{:10_250:}

歌者文明清理员 发表于 2023-4-16 17:29:19

两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

我很赞同

isdkz 发表于 2023-4-16 17:35:53

两手空空儿 发表于 2023-4-16 16:44
有一种被GPT统治的感觉...........

GPT是一场“提问的艺术”的大革命{:10_256:}

歌者文明清理员 发表于 2023-4-16 17:41:54

cmd.exe

xxx> pip install ipython
xxx> ipython
Ctrl+v

啊这啧啧啧 发表于 2023-4-16 21:59:45

歌者文明清理员 发表于 2023-4-16 17:41
cmd.exe

这个是什么
页: [1]
查看完整版本: 有个小小的问题想请教一下鱼油们