2011-03-02 85 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)