C#平方差练习代码结果错误是否由类型转换问题导致?
问题原因
你遇到的核心问题是C#的整数除法截断规则:当/运算符两侧的操作数都为int类型时,会执行整数除法,直接舍弃小数部分只保留整数位。因此你代码中的1/4计算结果为0,1/6计算结果也为0,自然无法得到正确返回值。
另外你代码中使用Math.Pow做整数平方计算是不必要的,Math.Pow返回double类型,强转int反而可能引入精度误差,直接用整数乘法更稳妥。
虽然方法要求返回int类型,但运算过程中可以调整计算顺序,利用公式结果必然为整数的特性,将除法放在所有乘法之后执行,完全可以避开浮点运算的问题:
- 和的平方公式可以改写为
(max * (max + 1) / 2) * (max * (max + 1) / 2),因为max和max+1必有一个偶数,max*(max+1)可以被2整除,不会出现小数 - 平方和公式可以改写为
max * (max + 1) * (2 * max + 1) / 6,三者的乘积必然可以被6整除,最后做除法也不会出现小数
修正后代码
public static class DifferenceOfSquares { public static int CalculateSquareOfSum(int max) { int sum = max * (max + 1) / 2; return sum * sum; } public static int CalculateSumOfSquares(int max) { return max * (max + 1) * (2 * max + 1) / 6; } public static int CalculateDifferenceOfSquares(int max) { return CalculateSquareOfSum(max) - CalculateSumOfSquares(max); } }
如果你坚持要用原来的公式写法,也可以把分数的分子改为浮点型触发浮点除法:比如把1/4改为1.0/4,1/6改为1.0/6,最后再转int即可,但这种方式不如调整运算顺序的方案性能高,也存在极小概率的浮点精度误差。
内容的提问来源于stack exchange,提问作者ClearlyQ
相关产品推荐
相关产品推荐

