C语言中的帕斯卡三角形与组合

Posted

技术标签:

【中文标题】C语言中的帕斯卡三角形与组合【英文标题】:Pascal's triangle in C with combinations 【发布时间】:2011-07-07 09:19:02 【问题描述】:
#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");
    

每经过十二行,数字就会开始减少。我做错了什么?

而且,GetInteger() 只是一个带有一些修饰的scanf()。我 100% 确定它可以完美运行。

【问题讨论】:

【参考方案1】:

在第 12 行阶乘之后,帕斯卡三角形元素变得太大,以至于 int 类型无法容纳它们 - 所以你会溢出(很可能你得到的值被包裹在最大 int 值附近)。

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

【讨论】:

【参考方案2】:

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

    三角形的第 n 行有 n 个元素(如果我们从 1 开始计数) 每行的第一个和最后一个元素是 1 除了第一个和最后一个元素之外的每个元素都是对角线上方的两个元素之和(如果三角形以对称方式书写)

您当然会受到所保存结果的数据类型大小的限制,但不会比必要的更快(受阶乘等中间结果)。

【讨论】:

【参考方案3】:

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)

【讨论】:

以上是关于C语言中的帕斯卡三角形与组合的主要内容,如果未能解决你的问题,请参考以下文章

杨辉三角,二项式系数,组合数,斐波那契数列

Java中的递归nCr组合

帕斯卡三角形,二项式定理

c_cpp 118.帕斯卡的三角形

C ++:如何产生帕斯卡三角形的第'n'行? [关闭]

在C中输入三角形的高度时打印帕斯卡三角形