Pascal在C中的三角形与组合

时间:2011-03-02 15:37:57

标签: c combinations factorial pascals-triangle

#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");
    }
}

每次超过12行时,数字开始减少。我做错了什么?

并且,GetInteger()只是一个scanf(),只有一些修饰。我百分百肯定它完美无缺。

3 个答案:

答案 0 :(得分:4)

在第12行阶乘之后,所以pascal三角形元素变得太大,因此int类型不能保持它们 - 所以你得到溢出(你得到的最可能的值都包含在最大int值之内)。

P.S。为什么在代码中使用3种不同的类型(long,int,float)?作为k!*(n-k)!总是划分n!你不需要浮点值(无论如何你使用整数除法和转换结果)。只需使用最大的整数类型,或者一些可以保存任意长度的整数的自定义BigInt类型 - 这样就可以显示大行数的正确值。

答案 1 :(得分:3)

不要从阶乘开始。从关于Pascal三角形的以下事实开始:

  1. 三角形的第n行有n个元素(如果我们从1开始计数)
  2. 每行的第一个和最后一个元素是1
  3. 除了第一个和最后一个元素之外的每个元素是对角线上方的两个元素的总和(如果三角形是以对称方式书写的)
  4. 您当然会受到所持数据类型大小的限制,但不会超过必要的时间(通过中间结果,例如阶乘)。

答案 2 :(得分: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)