最小公倍數:LCM(a,b) = |a×b| / GCD(a,b)。例:12 與 9,GCD=3,LCM=12×9/3=36。
public long Lcm(long a, long b)
{
a = Math.Abs(a); b = Math.Abs(b);
long g = Gcd(a, b);
return a / g * b; // 先除後乘,降低溢位風險
}
private int Gcd(int a, int b)
{
while (b != 0) { int r = a % b; a = b; b = r; }
return a;
}
原文件採用配對歸約(兩兩合併),支援奇數個參數:
public int GetLcm(params int[] nums)
{
if (nums.Length == 1) return nums[0];
var list = new List();
for (int i = 0; i < nums.Length - 1; i += 2)
list.Add(Lcm(nums[i], nums[i + 1]));
if (nums.Length % 2 == 1) list.Add(nums[^1]);
return GetLcm(list.ToArray()); // 遞歸歸約
}
// 迭代版更簡潔
public int LcmMultiple(params int[] nums)
{
int l = nums[0];
for (int i = 1; i < nums.Length; i++)
l = Lcm(l, nums[i]);
return l;
}
int 範圍有限(±21 億),a*b 極易溢位。long(±9×10¹⁸)或 BigInteger(任意大小)。a / g * b 保證中間結果 ≤ max(a,b)。