求1-20最小正公倍数的C#代码优化及输出控制咨询
解决方案
原代码问题分析
- 效率极低:原代码采用暴力枚举逐个递增数字,每次不满足整除条件就重置检查起点,对于1-20的最小公倍数,需要循环数十亿次,耗时极长。
- 多余输出:循环内的
Console.WriteLine(Number)会输出所有中间数值,不符合仅输出最终结果的需求。
优化思路
求1到20所有数的最小正整数,本质是计算这20个数的最小公倍数(LCM)。利用数学性质:
- 两个数的最小公倍数 = 两数乘积 / 两数的最大公约数(GCD)
- 多个数的最小公倍数可通过迭代计算:先算前两个数的LCM,再用结果和第三个数算LCM,以此类推直到第20个数。
- 用辗转相除法高效计算最大公约数,避免暴力枚举的低效问题。
优化后的C#代码
class Program { static void Main(string[] args) { long result = 1; for (int i = 2; i <= 20; i++) { result = CalculateLCM(result, i); } Console.WriteLine(result); Console.Read(); } // 计算最大公约数(辗转相除法) private static long CalculateGCD(long a, long b) { while (b != 0) { long temp = b; b = a % b; a = temp; } return a; } // 计算最小公倍数 private static long CalculateLCM(long a, long b) { return (a / CalculateGCD(a, b)) * b; // 先除法避免溢出 } }
代码说明
CalculateGCD方法用辗转相除法快速计算两个数的最大公约数,时间复杂度极低。CalculateLCM方法基于最大公约数计算最小公倍数,先做除法再乘法避免数值溢出(用long类型保证足够的容量)。- 迭代计算1到20的累积最小公倍数,最后仅输出最终结果,无中间冗余输出。
- 运行效率大幅提升,瞬间即可得到结果
232792560。
内容的提问来源于stack exchange,提问作者Mo R
相关产品推荐
相关产品推荐

