Ваша функция gcd
всегда будет возвращать 0
. Изменение
return y;
до
return x;
Понять алгоритм Евклида:
RULE 1: gcd(x,0) = x
RULE 2: gcd(x,y) = gcd(y,x % y)
рассмотрим 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
Как вы можете видеть, когда y
станет нулем x
будет gcd
, поэтому вам нужно вернуть x
, а не y
.
Также при расчете lcm вы сначала умножаете числа, что может вызвать переполнение. Вместо этого вы можете сделать:
lcm = x * (y / gcd(x,y))
но если lcm
не поместится в int
, вам придется сделать это long long