计算帕斯卡三角行平方和遇大数输出0的问题求助
问题:帕斯卡三角某一行平方和计算时大数值输出0
我需要计算帕斯卡三角某一行的平方和,但处理较大数值时程序只输出0。测试sum_squared(14)时结果为0,相关代码如下:
unsigned long sum_squared(const int line){ unsigned long long n = 2*line; unsigned long long x1 = factorial(line); unsigned long long k = x1*x1; unsigned long long x = factorial(n)/(k); return x; } unsigned long long factorial(unsigned long long n) { if (n == 0){ return 1; } return n * factorial(n - 1); }
测试代码:
printf("%lu\n", sum_squared(14));
问题原因
- 阶乘溢出:
unsigned long long的最大值是18446744073709551615,但28!(当line=14时,n=28)的数值远大于这个上限,导致factorial(28)计算时溢出,最终得到无效的小数值(甚至0),后续除法自然输出0。 - 返回值类型不匹配:
sum_squared返回unsigned long,其范围小于unsigned long long,即使计算正确也会导致结果截断。
解决方案
1. 用递推法计算组合数,避免大阶乘
帕斯卡三角第line行的平方和等于组合数C(2*line, line),可以通过递推逐步计算,每一步先乘后除(保证结果为整数),完全避免大阶乘溢出:
unsigned long long sum_squared(const int line) { unsigned long long result = 1; for (int i = 1; i <= line; ++i) { // 递推公式:C(2n, n) = C(2n, n-1) * (2n - i + 1) / i result = result * (2 * line - i + 1) / i; } return result; }
2. 修正输出格式与返回值类型
将sum_squared的返回类型改为unsigned long long,同时测试时使用对应格式符%llu:
printf("%llu\n", sum_squared(14));
此时sum_squared(14)会正确输出40116600。
内容的提问来源于stack exchange,提问作者Richard Gaál
相关产品推荐
相关产品推荐

