数据结构--求最大公约数(欧几里得算法)

package com.itany.oulijide;

public class Test
{

    public static void main(String[] args)
    {
        int result=gcd(50,15);
        System.out.println(result);
    }
    //默认m>n,如果m<n,那么第一次迭代的时候会把两者交换
    public static int gcd(int m,int n)
    {
        while(n!=0)
        {
            int rem=m%n;
            m=n;
            n=rem;
        }
        return m;
    }

}

运行时间为对数!

其计算原理依赖于下面的定理:

定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)

证明:a可以表示成a = kb + r,则r = a mod b

假设d是a,b的一个公约数,则有

d|a,d|b,而r = a - kb,因此d|r

因此d也是(b,a mod b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

时间: 2024-11-09 02:58:02

数据结构--求最大公约数(欧几里得算法)的相关文章

求最大公约数——欧几里得算法

欧几里得算法的原理:基于这样一种观察,两个整数x和y(x>y)的最大公约数等同于y和(x%y)的最大公约数: 数t整除x和y,当且仅当t整数y和(x%y):这是因为:x = t*y + x%y; 具体代码如下: #include <iostream> #include <stdlib.h> using namespace std; int gcd(int x, int y) { cout << x << " " << y

最大公约数-----欧几里得算法

欧几里得算法: 如果求两个数的最大公约数,那么最一般的求法是设置一个变量i=1,然后i不断加一,如果i加到某个数后两个数都能整除这个数了,然后把这个变量保存下来,然后最后的结果中最大的就是最大公约数. 然而这种方法时间复杂度可想而知有多高,所以一般情况瞎并不用这种方法,那么就有下面的欧几里得算法: 输入:两个数 a,b 输出:两个数的最大公约数 c 欧几里得算法:(1)找出两个数中最大的和最小的,分别为tmax.tmin, (2)不断令设置一个变量t代表tmin,tmin赋值为tmax  mod

【算法数据结构Java实现】欧几里得算法

1.背景 欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k 因为定理:如果M>N,则M mod N<M/2 ,说明时间复杂度是O(log(n)) 2.代码 package Algorithm_analysis; public class Euclid { public static void main(String[] args){ int m=63; int n=18; int remainder=0; whi

查找两个数的最大公约数——欧几里得算法

欧几里得算法: 百度百科:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = gcd(b,a mod b). 代码实现如下: import java.util.Scanner; public class Main { public static void main(String[] args) { //这里输入的a,b均是大于0的. Scanner cin = new Scanner(System.in); whil

求解最大公约数——欧几里得算法及其(解同余方程)拓展

最大公约数的求法中最过著名的莫过于欧几里得辗展相除法,它有两种形式(递归与非递归,其实是一样的,任何递归都可以写成非递归),下面看看GCD的实现代码: /***求a,b最大公约数***/ long long gcd(long long a, long long b) { if(b == 0) return a; else return gcd(b, a % b); } 證明过程(摘自维基百科:zh.wikipedia.org/wiki/輾轉相除法) 設 欲證 先設 可得且知 表示d是b,r的公因

欧几里得算法求最大公约数(gcd)

关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } 证明: 对于a,b,有a = kb + r  (a , k , b , r 均为整数),其中r = a mod b . 令d为a和b的一个公约数,则d|a,d|b(即a.b都被d整除), 那么 r =a - kb ,两边同时除以d 得 r/d = a/d - kb/d = m (m为整数,因为r也

欧几里得算法——求取最小公约数

1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 14-5-20. 5 */ 6 public class Euclid { 7 public static void main(String[] args){ 8 Scanner scanner=new Scanner(System.in); 9 String str=scanner.nextLine(); 10 int a=Integer.parseInt(s

欧几里得算法求最大公约数+最小公倍数

1,两个数互质:如果说两个数的公因数只有1,则可以说这两个数互质. 欧几里得算法求最大公约数: 首先求最大公约数,假设我们要求a和b的最大公约数 设a mod b = c: 可以得到一下的递推过程: a = kb + c ; 假设a , b 的最大公约数为d,则可以得到: a = md , b = nd; 可知m , n 互质: c = a - kb = md - knd = (m-kn)d; 我们已经知道m,n互质,则可以知道n和m-kn互质,则c和b的最大公约数也是d; 所以由以上的推论,我

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理.可能是本人时间长没看算法,脑子都生锈了. 看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为....在我还没看懂的时候,突然来了个所以...然后公式就这样推出来的.⊙﹏⊙b汗! 经过我这令人捉急的小脑袋转了半天,最后有了点眉目,所以拿出来和大家分享一下! 1.首先说一下:欧几里得算法是求两个数的最大公约数的,你可能会问:什么是最大公约数?