思路:
最大公约数问题也是1个非常典型的递归算法的利用。每次递归使得原来求两个大数之间的公约数转变成求两个略微小点的数之间的公约数,要求转换的进程要保证不会改变公约数的值。这就要看其中转换的原理了。
原理从《几何本来》中得出--展转相除。假定f(x,y) 表示x,y的最大公约数是g,而k = x/y,b= x%y,则g必能整出b。由于x = ky + b,b = x - ky,b/g = (x-ky)/g1定为整数,所以必有g整除b。
以下所示:
f(42,30) = f(30,12) = f(12,6)= f(6,0) = 6
代码以下:
- int gcd(int x , int y)
- {
- return (y == 0 )?x :gcd(y , x % y) ;
- }
非递归代码:
书中还引申出展转相减法,原理跟上面所述差不多。
[html] view plaincopy