【算法】欧几里德算法--求最大公约数

预备知识

因子(除数)

如果有整数 n,a,b 。a和b都不为0 ,且 有 n = a*b ,则说a(或者b,以下省略说明)为n的一个因子,或者说a能整除n。

特别的:任何非0整数都是0的因子,所以一般我们不会去求0的因子。

如:3 的因子有  1, -1 ,  3 ,  -3 。然而我们一般只考虑正数因子,因为负数因子和正数因此没有本质上的区别,只是符号不同而已。

素数:素数(也加叫质数)的定义是,如果整数p的因子 只有 ±1 和   ±p,则它就是素数 。特别的:0 和1既不是素数,也不是合数。

合数一定能分解为 若干个 素数相乘的形式。如 27 = 3x3x3 ,155 = 5x31

模运算

a为正整数,且可以表示为: a = q*m+r  ( r和q都是整数,且0<= r  < q ), 则说:  a mod q = r    。

例如: 7 mod 4 =  3      ,因为 7= 1*4 +3

我们并没有给出负数的模运算定义,因为它的定义不统一,也很少使用。但是要注意的是,在C/C++ 和 Java中,模运算的结果的符号和第一个操作数的符号相同。也就是说 a %  b 的结果和 a 的符号相同。

模运算是很有作用的,例如,任何 正整数 mod  m ,将会把他们映射到集合{0,1,2,...m-1}上。

欧几里德算法求最大公约数

将a ,b的公约数运算表示为函数gcd(a,b) 的返回值。a,b是不全为 0 的 非负数,且a >= b。

则  gcd(a,b)  =  gcd(b, a  mod  b)  ,可以看见是一个递归调用,调用结束的条件是 : 第二个参数为 0,则返回的结果为 第一个参数。

也就是说:gcd(m,0) =  m。

代码实现:

int gcd1(int a, int b)     //使用递归
{
    assert(a >= b);

    if (b == 0)
        return a;
    else
        return gcd1(b, a%b);

}

int gcd2(int a, int b)   //使用循环
{
    assert(a >= b);
    int r;

    while (b != 0)
    {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}
时间: 2024-10-26 12:29:27

【算法】欧几里德算法--求最大公约数的相关文章

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: 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)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

欧几里德与扩展欧几里德算法

转自网上大牛博客,讲的浅显易懂. 原文地址:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有

欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: 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)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

用python实现欧几里德算法求最大公约数

方法1: def gcd(x, y):   while n:       x, y = y, x % y   return x 方法2: def yue(x,y):      if y:              return gcd(y,x%y)      else:            return x 用python实现欧几里德算法求最大公约数,布布扣,bubuko.com

欧几里德算法(求两个正整数的最大公约数)

/*欧几里德算法:辗转求余  原理: gcd(a,b)=gcd(b,a mod b)  当b为0时,两数的最大公约数即为a getchar()会接受前一个scanf的回车符*/ #include<stdio.h> void main(){    int temp;    int a,b;    scanf("%d",&a);    scanf("%d",&b);    printf("the greatest common fa

两非负整数求最大公约数(欧几里德算法)---C/C++

#include<iostream> using namespace std; //欧几里德算法求两个非负整数的最大公约数 int getDivisor(int a,int b) { int max,min; max = a; min = b; //两数中大数模小数,若结果不为0,则舍弃大数 ,把小数和模运算的结果分出大小来,继续取模运算 //依次递归求解,直到模运算结果为0,则此时的小数就是最大公约数 if(max%min!=0){ if(max%min>min) return get

欧几里德算法求最大公约数

求最大公约数有暴力法和辗转相除法 时间复杂度 暴力:O(N) 辗转相除法:O(2logN) 辗转相除法原理: 设c为A B 的最大公约数 则存在K1 K2 使 A=K1*c B=K2*c; r为A模B r=A - K3*B; r=K1*c-K3*k2*c; r=(K1-K2*K3)*c; 所以A 和 B 的余数一定是最大公约数c的倍数 1 #include <stdio.h> 2 3 int gcd(int a, int b) 4 { 5 int temp, r; 6 if(a<b) 7

[转]求最大公约数的算法

更相减损术 更相减损术,又称"等值算法" 关于约分问题,实质是如何求分子,分母最大公约数的问题.<九章算术>中介绍了这个方法,叫做”更相减损术”,数学家刘徽对此法进行了明确的注解和说明,是一个实用的数学方法. 例:今有九十一分之四十九,问约之得几何? 我们用(91,49)表示91和49的最大公约数.按刘徽所说,分别列出分子,分母. “以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之.” 译文如下: 约分的法则是:若分子.分母

[算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)

题目 3在十进制下满足若各位和能被3整除,则该数能被3整除. 5在十六进制下也满足此规律. 给定数字k,求多少进制(1e18进制范围内)下能满足此规律,找出一个即可,无则输出-1. 题解 写写画画能找到规律,即是求与k互质的数x,x进制下即能满足上述规律. 相关 求最大公约数:辗转相除法(又叫欧几里得算法) 欧几里德定理:gcd(a, b) = gcd(b , a mod b) ,对于正整数a.b. 其中a.b大小无所谓.当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来. 代码