我用于计算阶乘(使用递归)的代码最多可以工作 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 位数字,您将写出 整数
计算超出了整数的容量。
#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 位数字,您将写出 整数
计算超出了整数的容量。