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

C#中while循环处理超大数值时运行异常问题咨询

序列求和代码的性能瓶颈与优化方案

问题现象

  • 传入参数10_000时,代码运行正常
  • 传入100_000时,加载耗时明显增加
  • 传入10_000_000时,程序完全无法正常运行

用户原以为机器处理数值大小不会影响运行效率,自查代码后未发现异常,当前代码实现特定序列求和逻辑,代码如下:

Console.WriteLine(SumSequenceElements(10_000_000));

static double SumSequenceElements(int n)
{
   int i = 1;
   double sum = 0;
   while (i <= n)
   {
      int j = 0;
      double power = 1;
      while (j < i + 1)
      {
         power *= -1;
         j++;
      }

      sum += power / (i * (i + 1));
      i++;
   }

   return sum;
}

性能瓶颈原因

你的代码存在嵌套循环:外层循环执行n次,内层循环每次执行i+1次,整体时间复杂度为O(n²)。当n=10000时,总循环次数约5000万次;n=100000时,总次数飙升至约50亿次;到n=1000万时,总次数会达到5万亿次级别,远超普通机器的处理能力,必然导致程序卡死。

另外,内层循环逻辑完全冗余:你通过循环i+1次乘以-1计算符号,实际上符号规律非常明确——当i+1为偶数时结果是1,为奇数时结果是-1,即符号等于(-1)^(i+1),无需循环即可直接判断。

优化后的代码

去掉内层循环,直接通过条件判断获取符号,时间复杂度降至O(n),处理1000万级数据也会非常高效:

Console.WriteLine(SumSequenceElements(10_000_000));

static double SumSequenceElements(int n)
{
    int i = 1;
    double sum = 0;
    while (i <= n)
    {
        // 直接计算符号:(-1)^(i+1)
        double power = (i + 1) % 2 == 0 ? 1 : -1;
        sum += power / (i * (i + 1));
        i++;
    }
    return sum;
}

进阶优化(可选)

还可通过数学公式拆分通项进一步提升效率:
通项(-1)^(i+1)/(i(i+1))可拆分为(-1)^(i+1)*(1/i - 1/(i+1)),求和时大量项会抵消,最终可推导出闭合公式:
有限n时,求和结果为1/2 + (-1)^(n+1)/(2(n+1)),用该公式计算时间复杂度为O(1),无论n多大都能瞬间出结果:

Console.WriteLine(SumSequenceElements(10_000_000));

static double SumSequenceElements(int n)
{
    return 0.5 + Math.Pow(-1, n + 1) / (2 * (n + 1));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:35:23