浅谈辗转相除求最大公约数
辗转相除法
先上代码吧
int gcd (int a,int b){
if(b == 0) return a;
else return gcd(b,a%b);
}
① 我们假设有两个数\(a\),\(b\) (\(a\) > \(b\)) , 设其最大公约数为 \(t\), 那么可表达为 \(a = m \times t\) , \(b = n \times t\).
② 其中一步为\(a\) % \(b\) , 我们设\(c\) = \(a\) % \(b\) = \(m \times t\) - \(k \times n \times t\) 也为 \(t\) 的倍数.
③ 那么下一部操作 \(gcd\) (\(b\) ,\(c\))使两个位置的数都不断向 \(t\) 逼近 (\(c\) 是模 \(b\) 后的数,比 \(b\) 小,下一次递归时\(c\) 就到了 \(b\) 的位置).
④ 所以最后\(b = 0\),也就是上一步的 \(a\) % \(b\) = 0,也就是这一步的 \(a\) ,上一步的 \(b\) 是最大公约数.
⑤ 例子 \(gcd\) (\(84\) , \(60\)) , \(gcd\) (\(60\) , \(24\)) , \(gcd\) (\(24\) , \(12\)) , \(gcd\) (\(12\) , \(0\)).
⑥ 在一开始时不用去管 \(a\) 与 \(b\) 谁大谁小 , 会自动交换的.例子 \(gcd\) (\(5\) , \(7\)),下一步就是 \(gcd\) (\(7\) , \(5\)).

浙公网安备 33010602011771号