You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现杨辉三角程序第13行后数值错误的技术求助

解决杨辉三角第13行后数值错误的问题

嘿,这个问题我之前踩过一模一样的坑!你的组合数逻辑本身是对的,但问题出在整数溢出上——这是用阶乘计算组合数时非常容易碰到的陷阱。

为什么会出错?

一般C语言里的int是32位类型,最大值是2147483647(也就是2^31-1)。我们来算下阶乘的数值:

  • 12! = 479001600,这个还在int的容纳范围内
  • 13! = 6227020800,这个数值远远超过了int的上限,溢出后会变成无意义的负数或乱码,自然计算出来的组合数就完全不对了。

两种实用解决方案

方案1:改用更大的数据类型

把存储阶乘和组合数的类型从int换成long long(64位整数,最大值是9223372036854775807),这样就能容纳更大的阶乘值,至少能支持到20行左右的杨辉三角。修改后的代码如下:

#include <stdio.h>

long long factorial(int number);
long long combination(int n, int k);

int main() {
    int lines;
    int i, j;

    printf("Number of Pascal Triangle lines: ");
    scanf("%d", &lines);

    for (i = 0; i <= lines; i++) {
        for (j = 0; j <= i; j++)
            printf("%lld ", combination(i, j));

        printf("\n");
    }
}

long long combination(int n, int k) {
    long long comb;

    comb = (factorial(n)) / (factorial(k) * factorial(n - k));

    return comb;
}

long long factorial(int number) {
    long long factorial = 1;
    int i;

    for (i = 1; i <= number; i++)
        factorial = factorial * i;

    return factorial;
}

方案2:用递推法直接计算杨辉三角

其实杨辉三角本身就有天然的递推性质:每行的首尾元素都是1,中间的元素等于上一行相邻两个元素之和。这种方法不需要计算大阶乘,效率更高,也更不容易溢出。代码示例:

#include <stdio.h>

int main() {
    int lines;
    int i, j;

    printf("Number of Pascal Triangle lines: ");
    scanf("%d", &lines);

    // 定义二维数组存储杨辉三角(C99及以上支持变长数组)
    int triangle[lines + 1][lines + 1];

    for (i = 0; i <= lines; i++) {
        // 每行首尾设为1
        triangle[i][0] = 1;
        triangle[i][i] = 1;

        // 计算中间元素
        for (j = 1; j < i; j++) {
            triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
        }

        // 打印当前行
        for (j = 0; j <= i; j++) {
            printf("%d ", triangle[i][j]);
        }
        printf("\n");
    }

    return 0;
}

如果需要支持更多行数,只需要把数组的类型改成long long就可以了。

内容的提问来源于stack exchange,提问作者m_botto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:54