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

求周长为n的整数边三角形数量:公式应用代码仅得半分问题求助

计算周长为n的整数边三角形数量的代码错误分析与修复

我需要编写程序计算周长为n的整数边三角形的存在数量,使用的公式如下:

  • 当n为偶数时,T(n) = n²/48
  • 当n为奇数时,T(n) = (n+3)²/48

我的实现代码如下:

static void Main(string[] args) { 
    int n = int.Parse(Console.ReadLine()); 
    double m = 0; 
    if(n%2==0) { 
        m =Math.Round( n * n / 48.0); 
    } else { 
        m = Math.Round((n + 3) * (n + 3) / 48.0); 
    } 
    Console.Write(m); 
}

但该代码仅获得一半的测试分数,请求分析问题原因并给出解决方案。

问题原因分析

你的代码存在两个核心问题,导致部分测试用例失败:

  1. 整数溢出问题
    你使用int类型计算n * n或(n+3)*(n+3),当n较大时(比如n > 46340),int类型的乘积会超出其取值范围(int的范围是-2147483648到2147483647),发生整数溢出,导致计算结果变成负数或错误的正数,最终得到错误的结果。

    例如:当n = 46341时,n * n = 2147488281,已经超过int的最大值,溢出后会变成负数,除以48.0后得到负数,Math.Round后结果完全错误。

  2. 浮点运算的潜在精度问题
    虽然Math.Round在大部分小数值场景下和公式要求的向下取整结果一致,但浮点运算本身可能存在精度丢失(比如非常大的n转换为double时,无法精确表示整数),导致Round的结果偏离正确的向下取整值。另外,公式的本质是取整数除法的结果(向下取整),而非四舍五入,用Round不符合公式的定义逻辑。

解决方案

针对上述问题,我们可以通过以下几点修复代码:

  1. 使用long类型存储中间计算结果,避免整数溢出;
  2. 用整数除法代替浮点运算和Math.Round,直接实现向下取整的逻辑;
  3. 增加对n < 3的边界判断(虽然原代码对n=1/2的计算结果正确,但显式判断更符合三角形的定义逻辑)。

修复后的代码:

static void Main(string[] args) { 
    int n = int.Parse(Console.ReadLine()); 
    long result = 0; 
    
    // 周长小于3无法构成三角形
    if (n >= 3) {
        if(n % 2 == 0) { 
            long nLong = n;
            result = (nLong * nLong) / 48; 
        } else { 
            long temp = n + 3;
            result = (temp * temp) / 48; 
        }
    }
    
    Console.Write(result); 
}

验证说明

  • 对于小数值n=7(奇数):(7+3)^2=100,100/48=2(整数除法向下取整),对应实际的2个三角形((1,3,3)、(2,2,3)),结果正确;
  • 对于大数值n=46341:使用long计算(46341+3)^2=46344²=2147766336,除以48得到44745132,结果正确;
  • 对于n=2:直接返回0,符合逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:34:07