zoukankan      html  css  js  c++  java
  • 欧几里得算法

    欧几里得算法

    1. 算法简介

    欧几里得算法是用来求解两个正整数的最大公约数(Greatest Common Divisor)的算法。

    2. 算法过程

    来源于百度百科。

    假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

    1997 / 615 = 3 (余 152)

    615 / 152 = 4(余7)

    152 / 7 = 21(余5)

    7 / 5 = 1 (余2)

    5 / 2 = 2 (余1)

    2 / 1 = 2 (余0)

    至此,最大公约数为1

    以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

    3. 算法证明

    证明:(gcd(a, b) = gcd(b, a mod b))

    假设 (a = kb + r)。((a, b, k, r) 都是正整数,且 (r < b)

    那么 (r = a mod b)

    假设 (d)(a, b) 的一个公约数,而 (r = a - kb)

    那么有 (frac{r}{d} = frac{a}{d} - frac{kb}{d} = m)。由等式右边可知:(m) 是一个正整数。

    因此 (d)(r) 的因子,也就是说 (d)(b)((a mod b)) 的公约数。

    那么我们得到结论一:对于任意一个((a,b))的公约数,他一定也是((b,a mod b)) 的公约数。

    接下来假设 (d)((b,a mod b)) 的一个公约数,将 (r = a - kb) 两边同时除以 (d),即:(frac{r}{d} = frac{a}{d} - frac{kb}{d}).

    由于 (r = a mod b),即 (d)(r) 的因子,那么等式右边一定是一个整数,又由于 (d)(b) 的约数,那么 (frac{kb}{d}) 一定是一个整数,那么 (frac{a}{d}) 也一定是一个整数,即 (d)(a) 的因子,也就是说 (d)((a,b)) 的公约数。

    那么我们得到结论二:对于任意一个((b,a mod b)) 的公约数,他一定也是((a,b)) 的公约数。

    由结论一和结论二可以得出:(gcd(a, b) = gcd(b, a mod b))

    4. 具体代码

    int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }
    
  • 相关阅读:
    GUI 监听事件 (两个按钮,实现同一个监听)
    GUI 监听事件
    GUI 练习
    GUI 之表格布局
    GUI 之边界布局
    GUI 之流布局
    [转帖]Linux 下解压 rar 文件
    Linux 启动、停止、重启jar包脚本
    关于linux下,ls vi等命令失效的解决方法(配置下环境变量出现问题)
    超好用的UnixLinux 命令技巧 大神为你详细解读
  • 原文地址:https://www.cnblogs.com/nonameless/p/14348649.html
Copyright © 2011-2022 走看看