0 c algorithm overflow lcm greatest-common-divisor
我的LCM计划结果出错了.
如果找到数字的gcd,然后用gcd划分产品.
int gcd(int x, int y)
{
while(y != 0)
{
int save = y;
y = x % y;
x = save;
}
return y;
}
int lcm(int x, int y)
{
int prod = x * y;
int Gcd = gcd(x,y);
int lcm = prod / Gcd;
return lcm;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.
您的gcd
功能将始终返回0
.更改
return y;
Run Code Online (Sandbox Code Playgroud)
至
return x;
Run Code Online (Sandbox Code Playgroud)
理解Euclid的算法:
RULE 1: gcd(x,0) = x
RULE 2: gcd(x,y) = gcd(y,x % y)
Run Code Online (Sandbox Code Playgroud)
考虑x = 12
和y = 18
gcd (12, 18)
= gcd (18, 12) Using rule 2
= gcd (12,6) Using rule 2
= gcd (6, 0) Using rule 1
= 6
Run Code Online (Sandbox Code Playgroud)
你可以看到什么时候y
变为零x
将是gcd
你需要返回x
而不是y
.
另外,在计算lcm时,您将首先乘以可能导致溢出的数字.相反,你可以这样做:
lcm = x * (y / gcd(x,y))
Run Code Online (Sandbox Code Playgroud)
但如果lcm
不能适应int
你必须做到的long long