2017-04-15 67 views
-3
#include <stdio.h> 
#include <stdlib.h> 

int factorial(int n) { 
    int f; 

    for(f = 1; n > 0; n--) 
     f *= n; 
    return f; 
} 

int ncr(int n,int r) { 
    return factorial(n)/(factorial(n-r) * factorial(r)); 
} 

int main(int argc, char* argv[]) { 

    int n, i, j; 

    n = atoi(argv[1]); 

    for(i = 0; i <= n; i++) { 

     printf("1"); 

     for(j = 1; j <= i; j++) 
      if(i == j && j > 0) printf(" 1"); 
      else printf(" %d", ncr(i, j)); 

     printf("\n"); 
    } 
    return 0; 
} 

如果我使用12以上的數字參數進行測試,我會從第12行(?)得到奇怪的數字。爲什麼會發生這種情況?我應該使用malloc還是數組?有人可以將此代碼更改爲數組或malloc?謝謝。如何將此代碼轉換爲數組或malloc?

+4

因子變得非常快,整數類型很快就不能代表這麼大的數字...... – ForceBru

+0

如果你真的需要處理這麼大的數字,請考慮類似[GNU MP Bignum庫](https: //gmplib.org/)。 –

+0

如果你想解決概率問題,你應該考慮使用'double'。你會失去精確度,但如果你隨着你的增長而增加,你應該沒問題。記住n!/ m!意味着你可以避免在min(m,n)的頂部或底部進行乘法運算,即12!/ 10!顯然是12 * 11 = 132,因爲1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10被取消。 – Persixty

回答

1

爲什麼很奇怪?因子13是6227020800,它超過了INTMAX,所以你捲入負面的土地。 「漫長的」可能會奏效。瞭解尺寸限制的MAX和MIN值。

在開始設計程序之前,請務必確保您的範圍。

+0

我用了很長的時間,現在能夠處理高達20的參數,但是當參數是66時,我仍然得到破解號碼... –

+0

因素迅速增長。看看https://gmplib.org/。嘗試在無符號字符數組中使用兩個程序的60位數字,每個字符中包含一個數字... unsigned char digits [60]。 – Gilbert