2016-08-30 49 views
-1

我正在使用舊學校乘法來計算階乘,但我仍然錯誤地回答了大於13的數字。我知道沒有數據類型可以準確地保存如此大的值,所以我使用數組來存儲每個數字在號碼分開。我的代碼中的錯誤在哪裏計算數字的階乘達99?

代碼中的「cas」表示要計算哪個階乘的數量。

這裏是代碼 -

void factorial (int cas) 
{ 
    int num[158]; 
    num[0] = 1; 

    for (int i=1; i<158; i++) 
    { 
    num[i] = 0; 
    } 

    int row1[158]; 
    int row2[158]; 
    int length = 0; 
    int max = 0; 
    int carry = 0; 

    for (int j=1; j<=cas; j++) 
    { 
    for (int i=0; i<158; i++) 
    { 
     row1[i] = 0; 
     row2[i] = 0; 
    } 

    for (length=157; length>=0; length--) 
    { 
     if (num[length] != 0) 
     break; 
    } 

    if (j/10 < 1) 
    { 
     int* ptr = num; 
     carry = 0; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = (j * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr = units; 
     ptr++; 
     } 
     *ptr = carry; 
    } 
    else 
    { 
     int* ptr = num; 
     int* ptr1 = row1; 
     row2[0] = 0; 
     int* ptr2 = row2 + 1; 
     carry = 0; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = ((j%10) * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr1 = units; 
     ptr1++; 
     } 
     *ptr1 = carry; 

     for (int i=0; i<=length; i++) 
     { 
     int mult = ((j/10) * num[i]) + carry; 
     int units = mult % 10; 
     carry = mult/10; 
     *ptr2 = units; 
     ptr2++; 
     } 
     *ptr2 = carry; 

     for (max=157; max>=0; max--) 
     { 
     if (row1[max] != 0 || row2[max] != 0) 
     break; 
     } 

     carry = 0; 

     for (int i=0; i<=max; i++) 
     { 
     int add = row1[i] + row2[i] + carry; 
     int units = add % 10; 
     carry = add/10; 
     *ptr = units; 
     ptr++; 
     } 
     *ptr = carry; 
    } 

    } 
    for (length=157; length>=0; length--) 
    { 
     if (num[length] != 0) 
     break; 
    } 

    for (;length>=0;length--) 
    { 
    printf("%i",num[length]); 
    } 

    printf("\n"); 
} 
+2

嘗試使用調試器來逐步運行您的程序並查看變量的演變。它會幫助你找到錯誤的位置 – Garf365

+0

可能的重複:http://stackoverflow.com/questions/1384160/calculating-factorial-of-large-numbers-in-c – Garf365

回答

1

你忘了按編號的數十部分乘以之前進位重置爲0。

} 
    *ptr1 = carry; 

    carry = 0; // ADDED LINE: Reset carry before multiplying with the tens part 

    for (int i=0; i<=length; i++) 
    { 
    int mult = ((j/10) * num[i]) + carry;