C语言阶乘和问题出现在哪

img


阶乘和运行结果有问题,出在哪,通过递归求阶乘和运行结果没法显示正确的,无论输入什么值,希望有详细的解答

sum没初始化

引用 皆我百晓生 小程序回复内容作答:
你的问题出现在递归计算阶乘的代码中。在代码的递归部分,你没有给变量 sum 赋初始值,导致 sum 的值是未定义的。此外,在计算阶乘和时,你没有将 sum 在每次循环开始时重置为零,导致阶乘和会累加之前的结果。

为了解决这个问题,你可以在进入循环之前将 sum 的初始值设为零,并在每次循环开始时将 sum 置零。此外,在计算阶乘时,你可以使用一个额外的变量 tempSum 来保存每个数字的阶乘结果,并将其加到 sum 中。以下是修复过的代码示例:

#include <stdio.h>

int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main() {
    int n;
    int j = 1;

    while (j == 1) {
        printf("请输入n:\n");
        
        flag:
        scanf("%d", &n);
        
        if (n < 1) {
            printf("输入有误,请重新输入!\n");
            goto flag;
        }
        
        int sum = 0;
        
        for (int i = 1; i <= n; i++) {
            int tempSum = factorial(i);
            sum += tempSum;
        }
        
        printf("%d的阶乘和为%d\n", n, sum);
        printf("若需继续测试,请输1;否则输0:\n");
        scanf("%d", &j);
    }
    
    return 0;
}

现在,你可以运行修复后的代码,并输入一个整数 n 来计算 1 到 n 的阶乘和了。希望这个解答对你有帮助!

你的递归应该这么写


int factorial(int n) {  
    if (n == 0 || n == 1) {  
        return 1;  
    } else {  
        return n * factorial(n - 1);  
    }  
}  

如果解决你的问题,请点赞采纳,谢谢

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。
下面是修正后的代码,修正的代码中在输入错误或者计算错误时会给出更明确的错误信息,并且避免了使用goto语句。

#include <stdio.h>  
  
int factorial(int n) {  
    if (n < 0) {  
        return -1; // 返回-1表示错误  
    } else if (n == 0) {  
        return 1;  
    } else {  
        return n * factorial(n - 1);  
    }  
}  
  
int main() {  
    int n;  
    int j = 1;  
      
    while (j == 1) {  
        printf("请输入n:\n");  
          
        while (1) { // 使用while循环代替goto  
            if (scanf("%d", &n) != 1) { // 检查输入是否成功  
                printf("输入有误,请重新输入!\n");  
                while (getchar() != '\n'); // 清空输入缓冲区  
            } else if (n < 1) {  
                printf("输入有误,请重新输入!\n");  
            } else {  
                break; // 输入正确,跳出循环  
            }  
        }  
          
        int sum = 0;  
          
        for (int i = 1; i <= n; i++) {  
            int tempSum = factorial(i);  
            if (tempSum < 0) { // 如果阶乘结果为负,说明有错误发生  
                printf("计算阶乘时发生错误。\n");  
                break; // 停止计算,跳出循环  
            }  
            sum += tempSum;  
        }  
          
        if (sum >= 0) { // 如果和为正,说明没有溢出  
            printf("%d的阶乘和为%d\n", n, sum);  
        } else { // 如果和为负,说明溢出  
            printf("计算阶乘和时发生溢出。\n");  
        }  
        printf("若需继续测试,请输1;否则输0:\n");  
        scanf("%d", &j);  
    }  
      
    return 0;  
}

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^