初莫M 发表于 2023-10-11 16:25:42

答案错误是什么原因啊

平台错误提示是

Wrong answer on line 17
Yours:
-501043139481094097
Correct:
378011820620313
题目是
输入一个正整数n
,计算1!+2!+⋯+n!
输入描述
多组输入,每行一个数字n
(n≤17


输出描述
对于每一行输入,输出1!+2!+3!+...+n!
的结果
(注意结果可能超出int的范围)
#include<stdio.h>
int main()
{
    long long n,i,a,sum=0,t=1;
    while(scanf("%lld",&n)!=EOF)
    {
    for(i=1;i<=n;i++)
    {
            for(a=1;a<=i;a++)
      {
            t=a*t;
      }
            sum=sum+t;
    }
    printf("%lld\n",sum);
      sum=0;t=1;
    }
}

isdkz 发表于 2023-10-11 16:26:01

这个程序的问题在于阶乘计算时没有将t清零,导致每次计算的结果都叠加在了一起。解决方法是在计算每个数的阶乘前将t清零。

修改后的代码如下:

#include <stdio.h>

int main()
{
    long long n, i, a, sum = 0, t = 1;
    while (scanf("%lld", &n) != EOF)
    {
      for (i = 1; i <= n; i++)
      {
            t = 1; // 清零
            for (a = 1; a <= i; a++)
            {
                t = a * t;
            }
            sum = sum + t;
      }
      printf("%lld\n", sum);
      sum = 0;
    }
    return 0;
}

陶远航 发表于 2023-10-11 16:26:16

你的代码中存在一个问题,就是在计算阶乘的时候,你没有在每次计算完一个数的阶乘后将t重新设为1。这导致了你在计算阶乘的时候,实际上是在计算前一个数的阶乘的基础上继续乘以当前的数,而不是计算当前数的阶乘。

你的代码应该修改为如下形式:

#include<stdio.h>

int main() {
    long long n,i,a,sum=0,t=1;
    while(scanf(\"%lld\",&n)!=EOF) {
      for(i=1;i<=n;i++) {
            t=1; // 将t重新设为1
            for(a=1;a<=i;a++) {
                t=a*t;
            }
            sum=sum+t;
      }
      printf(\"%lld\
\",sum);
      sum=0;
    }
}


在这个修改后的代码中,每次在计算一个新的数的阶乘之前,都会将t重新设为1,这样就能正确地计算每一个数的阶乘,然后将它们加起来。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-11 16:27:28

问题在于当n比较大时,阶乘的结果会超出long long的范围,从而导致计算错误。

可以考虑使用高精度来进行计算。将阶乘的结果存储在一个数组中,每位存储一个数字,每次乘法计算时对数组进行更新即可。

以下是修改后的代码:


#include <stdio.h>
#include <string.h>

#define MAX_LEN 1000

void multiply(int ans[], int n) {
    int carry = 0;
    for (int i = 0; i < MAX_LEN; i++) {
      int tmp = ans * n + carry;
      ans = tmp % 10;
      carry = tmp / 10;
    }
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
      int ans = {1}; // 存储阶乘的结果
      int sum = {0}; // 存储1!+2!+...+n!的结果
      for (int i = 1; i <= n; i++) {
            multiply(ans, i);
            for (int j = 0; j < MAX_LEN; j++) {
                sum += ans;
            }
      }
      // 处理进位
      for (int i = 0; i < MAX_LEN - 1; i++) {
            sum += sum / 10;
            sum %= 10;
      }
      // 找到最高位
      int idx = MAX_LEN - 1;
      while (idx > 0 && sum == 0) {
            idx--;
      }
      // 输出结果
      for (int i = idx; i >= 0; i--) {
            printf("%d", sum);
      }
      printf("\n");
    }
    return 0;
}


这里定义了一个multiply函数,用来计算阶乘。通过数组模拟阶乘的计算过程,然后将结果存储在数组中,最后将一次乘法的计算结果累加到sum数组中。

为了避免溢出,sum数组也使用了数组模拟,每位存储一个数字。最后输出时需要注意去掉前导零,并且反向输出结果。

这样就可以得到正确的答案了。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 答案错误是什么原因啊