двоичный алгоритм gcd — не работает

Я прочитал двоичный алгоритм gcd и попытался реализовать его. Это сработало. Это мой код

int gcd2(int a, int b) {
int sh;

if (a == 0)
return b;
if (b == 0)
return a;

for (sh = 0; !((a | b) & 1); sh++) {
a >>= 1;
b >>= 1;
}

while (!(a & 1)) {
a >>= 1;
}

while(b) {
while (!(b & 1)) {
b >>= 1;
}

if (a > b) {
int t = a;
a = b;
b = t;
}

b = b - a;
}

return a << sh;
}

Но не работает, если я заменю последний, если с

    if (b > a)
{
int t = a;
a = b;
b = t;
}

b = a -b;

Я просто подумал, что оба должны работать, потому что они делают то же самое. Но это не работает.
Кто-нибудь может объяснить это, пожалуйста?

Заранее спасибо!

0

Решение

это не то же самое: если вы выберете второй путь, есть вероятность, что а всегда будет больше, чем б. тогда вы никогда не получите переменные svap, и b всегда меньше, чем a после b = a-b, если b положительно

я думаю, используя

a=a-b

вместо

b=a-b

мог бы сделать это

1

Другие решения


По вопросам рекламы [email protected]