编程之美 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;
}

 

 

posted on 2012-12-25 22:16  小龙人2012  阅读(119)  评论(0编辑  收藏  举报

导航