SP中的SPOJ小因子计划

时间:2015-02-05 19:06:19

标签: c factorial

Small Factorial

我的代码显示错误的输出'在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);
    }
}

2 个答案:

答案 0 :(得分:5)

你的程序正在整数溢出。您至少需要66 bytes才能存储100个!究竟。 unsigned long long int通常为8个字节,最多可存储1.8×10 19 。 100!约为9.3 × 10157

您需要另一种方法来计算此值,或使用其他语言。您可以尝试将值存储在doublelong double中,但这并不准确,因此我怀疑它是否会满足SPOJ。

答案 1 :(得分:3)

100!是一个巨大的数字(我认为约160位数)。 &#34;漫长的&#34;可以存储最多19位数。您可以执行以下任何操作来解决此问题:

  • 使用支持java或python等非常大的整数的语言。
  • 为c / c ++等语言创建自己的biginteger类型代码。使用数组表示整个庞大的数字,数组的每个索引只存储该数字的一位数。例如,如果数字为123,则索引[0]存储数字1,索引[1]存储数字2,索引[2]存储数字3.(您可以根据您的选择以相反的顺序存储它们。)

你提出的代码会受到整数溢出的影响。使用double / long double不会起作用,因为它会遭受精确丢失。