最大公约数-辗转相除法

Posted on 2008-06-19 17:29  啊夏  阅读(378)  评论(0编辑  收藏  举报
   给定两个数 a,b, (a > b) 求 a ,b的最大公约数 gcd(a,b)。
算法的原型来自 欧几里德的《几何原本》(第VII卷,命题i和ii)中。

原理是:
   若 r 是 a ÷ b 的余数, 则 gcd(a,b) = gcd(b,r)

这样程序就好写了。

int gcb(int a,int b)
{
     int r = 0;
     while (b)
     {
         r = a%b;
         a = b;
         b = r;
     }
     return a;
}


很简单的东西。这个题目是在看另外一道题目的时候遇到的 “如何在程序里精确地表示一个小数”。答案是:表示成分数。 于是就有了求最大公约数的问题了。

ps: 无限循环小数 0.nnnnn(n) ,这里单n 循环,可以表示成 n/9  (0.9(9) = 1)