编程之美 2.7 最大公约数
直接用辗转相除法。即设f(x,y)为x,y最大公约数,则f(x,y) = f(y, x%y).
主要的思路比较清晰,在这里记录一下辗转相除法的证明,就当找一找高中的感觉吧。。
设:x,y(x>=y)最大公约数是c,证明x,x%y的最大公约数同样是c。
1、x = k*y + r; r = x%y.
2、设x = mc,y = nc;
3、由1,2得:mc=knc +r,即:r=(m-kn)c;
4、此时,只需证明m-kn与n是互素即可。
反证:设m-kn与n非互素,则m-kn = ed,n =qd, => m = kn+ed = kqd+ed = (kq+e)d, 又x =mc = (kq+e)dc, y=nc = qdc,=>x与y最大公约数为cd,这与条件x,y最大公约数为c矛盾,=>m-kn与n互素。
#include<iostream> using namespace std; int GCD1(int x, int y){ return (!y) ? x : GCD1(y, x%y); } int GCD(int x, int y){ return x > y ? GCD1(x, y) : GCD1(y, x); } int main(){ int x, y; cin >> x >> y; cout <<GCD(x, y) << endl; return 1; }