我用于计算阶乘(使用递归)的代码最多可以工作 24,但之后在 c 中显示不正确的答案。请检查

My code to calculate in factorial (using recursion) works up to 24 but shows incorrect answers after that in c. Please check

#include <stdio.h>
int main()
{
    int n, t, rem, i, j, k;
    scanf("%d", &t);
    int ans[t], integer[1000];
    for(i=0; i<t; i++)
    {
        int count=0;
        scanf("%d", &n);
        for(j=0; j<1000; j++)
        {
            integer[j]=0;
        }
        for(j=0, k=n; k>0; k/=10, j++)
        {
            integer[j]=k%10;
            count++;
        }
        factorial(n, count, integer);
    }
    return 0;
}
void factorial(int n, int count, int* integer)
{
    int i, j, k, rem=0, temp;
    if(n==1)
    {
        for(i=count-1; i>=0; i--)
        {
            printf("%d", integer[i]);
        }
        printf("\n");
        return;
    }
    else
    {
        for(i=0; i<count; i++)
        {
            temp=integer[i]*(n-1);
            integer[i]=(temp%10)+rem;
            rem=temp/10;
            if(i==count-1)
               {
                    if(rem!=0)
                    {
                        for(j=0, k=rem; k>0; k/=10, j++)
                        {
                        integer[count]=k%10;
                        count++;
                        }
                        break;
                    }
               }
        }
        factorial(n-1, count, integer);
    }

}

解释:我用相反的方式保存数字 前输入:100 保存在数组中的整数:0 0 1 0 0 0 0 ... 然后调用阶乘函数时,它将 n=100、count=3 和整数数组作为输入。 我们将数组的第一个元素乘以 n-1 并进行余数...这一直进行到整个整数数组与 99 相乘,然后我们再次调用阶乘,从而将数组与 98 相乘,依此类推,直到我们到达1 我们最终打印答案的地方。

问题:代码最多只能给出 24 个正确的结果,此后给出错误的输出。

你假设 integer 中的每个元素都在 0 到 9 之间,但事实并非如此,在写一个数字后添加一个 space 表示问题,例如计算从 1 到 22 的事实:

1 
2 
6 
2 4 
1 2 0 
7 2 0 
5 0 4 0 
4 0 3 2 0 
3 6 2 8 8 0 
3 6 2 8 8 0 0 
3 9 9 1 6 8 0 0 
4 7 8 10 0 1 6 0 0 <<< wrong value for !12
6 2 2 7 0 2 0 8 0 0 
8 7 1 7 8 2 9 1 2 0 0 
1 3 0 7 6 7 4 3 6 8 0 0 0 
2 0 9 2 2 7 8 9 8 8 8 0 0 0 
3 5 5 6 8 7 4 2 8 0 9 6 0 0 0 
6 4 0 2 3 7 3 7 0 5 7 2 8 0 0 0 
1 2 1 6 4 5 0 10 0 4 0 8 8 3 2 0 0 0  <<< wrong value for 19
2 4 3 2 9 0 2 0 0 8 1 7 6 6 4 0 0 0 0 
5 1 0 9 0 9 4 2 1 7 1 7 0 9 4 4 0 0 0 0 
1 1 2 3 10 0 0 7 2 7 7 7 7 6 0 7 6 8 0 0 0 0 <<< wrong value for 22

所以你的问题来了,因为你没有管理好进位

示例 4 7 8 10 0 1 6 0 0 以正确的方式处理会产生 4 7 9 0 0 1 6 0 0 符合预期

要在factorial

之后解决
rem=temp/10;

添加

if (integer[i] > 9)
{
    rem += integer[i] / 10;
    integer[i] %= 10;
}

其中:

  • ans[t]没用
  • 当您使用 scanf 或等效函数时,请检查结果以确保输入了有效值
  • 如果结果以 10 为基数使用超过 1000 位数字,您将写出 整数

计算超出了整数的容量。