我的代码显示错误的输出'在SPOJ中,虽然它在我的编译器中运行没有问题。
该计划的代码是:
#include<stdio.h>
int factorial(int);
int main(){
int a[100],t,n,i;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&a[i]);
}
for(i=0;i<t;i++){
printf("%d",factorial(a[i]));
printf("\n");
}
return 0;
}
int factorial(int n){
if(n==0){
return 1;
}
else if(n==1){
return 1;
}
else{
return n*factorial(n-1);
}
}
答案 0 :(得分:5)
你的程序正在整数溢出。您至少需要66 bytes才能存储100个!究竟。 unsigned long long int
通常为8个字节,最多可存储1.8×10 19 。 100!约为9.3 × 10157。
您需要另一种方法来计算此值,或使用其他语言。您可以尝试将值存储在double
或long double
中,但这并不准确,因此我怀疑它是否会满足SPOJ。
答案 1 :(得分:3)
100!是一个巨大的数字(我认为约160位数)。 &#34;漫长的&#34;可以存储最多19位数。您可以执行以下任何操作来解决此问题:
你提出的代码会受到整数溢出的影响。使用double / long double不会起作用,因为它会遭受精确丢失。