2015-09-24 77 views
-2

的階乘它是在一個網站的測試,這裏是代碼是計算大數

#include <stdio.h> 

void Print_Factorial (const int N); 

int main() 
{ 
    int N; 
    scanf("%d",&N); 
    Print_Factorial(N--); 

    return 0; 
} 

/* your code will be put in here*/ 

#include <math.h> 

int getFactLength(int N){ 
    double length = 0; 
    while(N){ 
     length += log10(N--); 
    } 
    return (int)length+1; 
} 

void printFact(int fact[], int length){ 
    while(length--){ 
     printf("%d",*fact++); 
    } 
} 

void initialNums(int nums[], int length, int num){ 
    while(length--){ 
     *nums++ = num; 
    } 
} 

void Print_Factorial(const int N){ 
    if(N < 0){ 
     printf("Invalid input"); 
     return ; 
    } 
     int NT = N; 
    if(NT>=0 && NT<15){ 
     int fact = 1; 
     while(NT){ 
      fact *= NT--; 
     } 
     printf("%d",fact); 
     return ; 
    } 

    int length = getFactLength(N); 
    int fact[length]; 
    initialNums(fact, length, 0); 
    fact[length-1] = 1; 
    int lastNoneZeroIndex = length-1; 
    while(NT > 1){ 
     int lengthT = length; 
     int carry = 0; 
     while(lengthT-- > lastNoneZeroIndex){ 
      int result = NT*fact[lengthT] + carry; 
      fact[lengthT] = result % 10; 
      carry = result/10; 
     } 
     while(carry){ 
      fact[--lastNoneZeroIndex] = carry % 10; 
      carry /= 10; 
     } 
     NT--; 
    } 

    printFact(fact, length); 
} 

我使用020值進行測試,所有的人都是正確的程序。但是當我在該網站上提交它時,測試用例總是不通過。我不知道那是什麼情況。但是,有5個案例,所有測試案例都在0到1000之間,其中兩個不超過15個,其中一個是否定的,其中一個使用最多時間通過,所以我認爲未通過的案例是一個小於1000的數字。這就是我所知道的,我無法想象1000個通過了,但小於1000的數字沒有通過。我不知道我可愛的代碼有什麼問題。我希望你能看我的代碼,並找到一些錯誤。

+1

嘗試測試你的大投入方案了。例如,您是否檢查過,如果輸入爲100,您的程序將返回93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000? – Ilya

+1

你的程序實際上計算1000!正確。我相信你有一個格式問題。 –

+1

在階乘後不打印新行。也許自動chacker期待這一點。 (一個新行也會刷新輸出。) –

回答

0

在事實變量中創建了一個溢出,在這裏您使用int類型作爲事實變量。 對於輸入13,14,它給出了錯誤的答案。

解決方案:

long long int fact = 1;

,或者

變化的條件 - if(NT>=0 && NT<13)

+0

的因子數字,非常感謝!你是對的 。 12!大於4億,13!會溢出。 – erDaren

+0

對不起,我在這裏新來的,即時學習英語...... – erDaren