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
相关产品推荐
相关产品推荐

