不使用数组基于欧几里得算法实现三个整数的最大公约数求解
三整数最大公约数(GCD)实现优化方案
你已实现的两参数欧几里得GCD计算逻辑是完全可用的,结合三个数GCD的数学性质:
gcd(a, b, c) = gcd(a, gcd(b, c)) = gcd(gcd(a, b), c) = gcd(gcd(a, c), b)
直接复用已有的两参数方法即可实现三参数GCD计算,完全满足「不使用数组」的要求,不需要单独编写复杂的多分支判断逻辑,可大幅降低出错概率。
已验证的两参数GCD实现(原有正确代码)
public static int GetGcdByEuclidean(int a, int b) { if (a == 0 && b == 0) { throw new ArgumentException(null); } else if (a == int.MinValue) { throw new ArgumentOutOfRangeException(nameof(a)); } else if (b == int.MinValue) { throw new ArgumentOutOfRangeException(nameof(b)); } else { int abs1 = Math.Abs(a); int abs2 = Math.Abs(b); a = abs1; b = abs2; while (a != 0 && b != 0) { if (a > b) { a %= b; } else { b %= a; } } return a | b; } }
正确的三参数GCD实现
public static int GetGcdByEuclidean(int a, int b, int c) { // 复用两参数方法,先算后两个数的GCD,再和第一个数算GCD即可 return GetGcdByEuclidean(a, GetGcdByEuclidean(b, c)); }
原有三参数实现的问题说明
你原先单独编写的三参数实现存在以下可优化点:
- 多分支判断逻辑冗余,覆盖场景不全,遇到边界输入(比如其中一个参数为0)时容易出现计算错误
- 循环终止条件为三个数全不为0,只要有一个数为0就会退出循环,此时result的赋值逻辑无法适配所有边界场景
- 重复实现了欧几里得算法的核心逻辑,没有复用已验证的正确代码,增加了维护成本
内容的提问来源于stack exchange,提问作者Linascts
相关产品推荐
相关产品推荐

