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

计算帕斯卡三角行平方和遇大数输出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:25:50