Я прочитал двоичный алгоритм 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;
Я просто подумал, что оба должны работать, потому что они делают то же самое. Но это не работает.
Кто-нибудь может объяснить это, пожалуйста?
Заранее спасибо!
это не то же самое: если вы выберете второй путь, есть вероятность, что а всегда будет больше, чем б. тогда вы никогда не получите переменные svap, и b всегда меньше, чем a после b = a-b, если b положительно
я думаю, используя
a=a-b
вместо
b=a-b
мог бы сделать это