2015-02-05 60 views
-1

Small FactorialSPOJ小階乘程序用C

我的代碼是表示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); 
    } 
} 
+1

根據問題規範,n <= 100。考慮數量有多大100!是。它是否適合'int'? – njuffa 2015-02-05 19:09:53

+0

你也可以嘗試一個非遞歸函數:'int result = 1; for(int i = n; i> 1; i--)result * = i;'雖然它看起來是正確的。沒有看到你的'錯誤的輸出',我不知道。 – MiltoxBeyond 2015-02-05 19:15:58

+0

long double is required – MiltoxBeyond 2015-02-05 20:12:46

回答

5

你的程序越來越整數溢出。您至少需要66 bytes才能存儲100個!究竟。一個unsigned long long int通常是8個字節,並且可以存儲高達1.8×1。 100!大約是9.3 × 10157

您需要另一種方法來計算此值,或使用不同的語言。您可以嘗試將值存儲在doublelong double中,但這並不準確,所以我懷疑它會滿足SPOJ。

+0

可能是重複的,它需要[〜524.765位](http: //www.wolframalpha.com/input/?i=log+base+2+of+%28100!%29)存儲100! – 2015-02-06 09:00:23

3

100!是一個龐大的數字(我認爲大約有160位數字)。 「long long」可以存儲最多19位數字。您可以執行以下任何操作來解決此問題:

  • 使用支持非常大的整數(如java或python)的語言。
  • 爲c/C++等語言創建自己的biginteger類型代碼。使用數組來表示整個巨大的數字,數組中的每個索引只存儲數字的一個數字。例如,如果數字是123,則索引[0]存儲數字1,索引[1]存儲數字2,索引[2]存儲數字3(您可以根據您的選擇以相反順序存儲它們)。

你已經忍受的代碼遭受整數溢出。使用double/long double將不起作用,因爲它會遭受精確度損失。