求周长为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); }但该代码仅获得一半的测试分数,请求分析问题原因并给出解决方案。
问题原因分析
你的代码存在两个核心问题,导致部分测试用例失败:
整数溢出问题
你使用int类型计算n * n或(n+3)*(n+3),当n较大时(比如n > 46340),int类型的乘积会超出其取值范围(int的范围是-2147483648到2147483647),发生整数溢出,导致计算结果变成负数或错误的正数,最终得到错误的结果。例如:当
n = 46341时,n * n = 2147488281,已经超过int的最大值,溢出后会变成负数,除以48.0后得到负数,Math.Round后结果完全错误。浮点运算的潜在精度问题
虽然Math.Round在大部分小数值场景下和公式要求的向下取整结果一致,但浮点运算本身可能存在精度丢失(比如非常大的n转换为double时,无法精确表示整数),导致Round的结果偏离正确的向下取整值。另外,公式的本质是取整数除法的结果(向下取整),而非四舍五入,用Round不符合公式的定义逻辑。
解决方案
针对上述问题,我们可以通过以下几点修复代码:
- 使用
long类型存储中间计算结果,避免整数溢出; - 用整数除法代替浮点运算和
Math.Round,直接实现向下取整的逻辑; - 增加对
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
相关产品推荐
相关产品推荐

