2011-03-02 59 views
2
#include <stdio.h> 
long factorial(int num) 
{ 
    int counter; 
    int fact = 1; 
    for (counter = num; counter > 0; counter--) fact *= counter; 
    return fact; 
} 

float combinations(int n, int k) 
{ 
    int numerator = factorial(n); 
    int denominator = factorial(k) * factorial(n-k); 
    float fraction = numerator/denominator; 
    return fraction; 
} 
int main() 
{ 
    printf("How many rows of Pascal\'s triangle should I print?\t"); 
    int rows = GetInteger(); 
    int counter; 
    int counter2; 
    for (counter = 1; counter <= rows; counter++) 
    { 
     int y = rows-counter; 
     for (; y > 0; y--) printf(" "); 
     for (counter2 = 0; counter2 <= counter; counter2++) 
       printf("%6.0lu", (long) combinations(counter, counter2)); 
     printf("\n"); 
    } 
} 

每當我走過十二排時,數字開始減少。我究竟做錯了什麼?C組合中的帕斯卡三角形

而且,GetInteger()只是一個scanf()與幾個觸摸ups。我100%肯定它完美的作品。

+4

Heheh,Pascal in C ... – 2011-03-02 15:38:24

回答

4

第12行factorial等pascal三角形元素變得太大,所以int類型不能容納它們 - 所以你會得到溢出(最可能的值是你包裹最大的int值)。

P.S.爲什麼你在代碼中使用3種不同的類型(long,int,float)?作爲k!*(n-k)!總是把n分開!你不需要浮點值(你可以使用整數除法並且將結果轉換爲長整數)。只需使用您可以使用的最大整數類型,或者一些可以保存任意長度整數的自定義BigInt類型 - 這樣您就可以爲大行數顯示正確的值。

3

不要從階乘開始。約帕斯卡三角以下事實開始:

  1. 三角形的第n行有n個元素(如果我們從1開始計數)
  2. 每一行的第一個和最後一個元素是1
  3. 每個元素除了第一個和最後一個是對角線上方的兩個元素的總和(如果三角形以對稱方式寫入)

您當然會受限於您所持有的數據類型的大小導致,但不是在必要的前提下(通過中間結果等)作爲階乘)。

2

INT_MAX通常是2,147,483,647
12!是479,001,600
13!是6,227,020,800,但您的功能factorial(13)返回1,932,053,504(= 6,227,020,800 - 4,294,967,296)