欧几里得算法-----欧几里德算法

欧几里得算法

欧几里得算法又称辗转相除法,主要用于计算两个整数a,b的最大公约数。

原理:gcd(a,b)=gcd(b,a mod b)(这里a>=b

gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|

证明gcd(a,b)=gcd(b,a mod b):a可以表示成a = kb + r,则r= a mod b   假设d是a,b的一个公约数,则有d|a、 d|b(a|b表示a整除b),而r
= a - kb,因此d|r,因此d是(b,a mod b)的公约数;假设d 是(b,a mod b)的公约数,则d| b , d |r ,因为a = kb +r,所以d也是(a,b)的公约数。因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,证毕。

函数gcd的代码如下:C/C++代码

①递归

可运行代码:

#include<stdio.h>
#include<iostream>
using namespace std;
//递归法实现gcd
int gcd(int a,int b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    //cin>>m>>n;
    printf("%d\n",gcd(m,n));
    //cout<<gcd(m,n)<<endl;
    return 0;
}

核心代码:

//递归法实现gcd
int gcd(int a,int b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}

或者

//递归法实现gcd
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

②迭代

可运行代码:

#include<stdio.h>
#include<iostream>
using namespace std;
//迭代法实现gcd
int gcd(int a,int b)
{
    int c;
    while(b)
    {
        c=a%b;
        a=b;
        b=c;
    }
    return a;
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);//cin>>m>>n;
    printf("%d\n",gcd(m,n));//cout<<gcd(m,n)<<endl;
    return 0;
}

核心代码:

//迭代法实现gcd
int gcd(int a,int b)
{
    int c;
    while(b)
    {
        c=a%b;
        a=b;
        b=c;
    }
    return a;
}

欧几里得算法-----欧几里德算法

时间: 2024-10-10 23:08:55

欧几里得算法-----欧几里德算法的相关文章

最小公约数(欧几里得算法&amp;&amp;stein算法)

求最小公约数,最容易想到的是欧几里得算法,这个算法也是比较容易理解的,效率也是很不错的.也叫做辗转相除法. 对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b) 证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k:显然r>=0,  r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0: 因此求gcd(a,b)可以转移到求gcd(b,a%b),那么这就是个递归过程了,那什么时候递归结束呢

扩展欧几里得算法------扩展欧几里德算法

扩展欧几里得算法及其应用 一.扩展欧几里得算法 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,若gcd(a,b)表示 a,b 的最大公约数,必然存在整数对x,y ,使得 ax+by = gcd(a,b). 算法过程: 设 a>b,当 b=0时,gcd(a,b)=a.此时满足ax+by = gcd(a,b)的一组整数解为x=1,y=0:当a*b!=0 时, 设 a*x1+b*y1=gcd(a,b):b*x2+(a mod b)*y2=gcd(b,a mod b): 根据欧几里得原理知 g

python常用算法(6)——贪心算法,欧几里得算法

1,贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解. 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解.要会判断一个问题能否用贪心算法来计算.贪心算法和其他算法比较有明显的区别,动态规划每次都是综合所有问题的子问题的解得到当前的最优解(全局最优解),而不是贪心地选择:回溯法是尝试选择一条路,如果选择错了的话可以“反悔”,也就是回过头来重新选择其他的试试. 1.1

[算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数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的值交换过来. 代码

算法学习 - 欧几里得算法(辗转相除法)(c++实现)

欧几里得算法 欧几里得算法也叫辗转相除法,是求两个整数最大公约数的算法. 当然也可以求最小公倍数. 算法实现 其实算法的实现原理就是,有整数a b两个,每次求的一个数字r = a % b,然后把b放到a的位置,把r放到b的位置,递归调用. 就是gcd(a, b) { return gcd(b, a%b); }这个样子的. 结束条件是当 a%b == 0的时候停止. 最大公约数 // // main.cpp // Euclidean // // Created by Alps on 15/3/28

欧几里得算法与扩展算法相关内容

推荐博客     http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里得算法求最大公约数(辗转相除) 定理 gcd( m , n )=gcd ( n , m mod n ) ( m>n 且 m mod n 不为0) 最小公倍数记为lcm( m , n ),显然lcm( m , n )=m*n / gcd( m , n ) 对于正整数k,有性质 lcm( km , kn)=k*gcd( m , n ) 欧几里得算

菜鸟学算法----改进后的欧几里得算法

对于正整数 a和b  利用欧几里得算法可以得出 一个最大公因数 ,  改进后的算法满足  最大公因数 q=xa+yb   ; 那么我们如何求出 a和b呢 . 书上是这么写的 那么我们用代码把他实现出来, 向大家推荐一本书<The Art Of Computer.Programmer>   第一篇的数学部分   真心的枯燥 我选择的方式 是 适当的囫囵吞枣 对于这一样 ,但是对于其中讲述的算法 还是要仔细的去看滴 . 对于算法的分析  我直接上原书图 #include "stdafx.

算法学习 之 欧几里得算法和扩展欧几里得算法(二)

关于扩展欧几里得算法(Extended Euclidean Algorithm),我是在做青蛙的约会这一经典题目才接触到这个算法的.后面也有关于这一题的AC代码和解题思路. 内容:已知a, b,求解一组x,y,使它们满足贝祖等式: ax+by =gcd(a, b) 扩展欧几里得算法,就和它的名字一样是对欧几里得算法的扩展.何为扩展?一是,该算法保留了欧几里得算法的本质,可以求a与b的最大公约数.二是,已知a, b求解二元一次方程ax+by =gcd(a, b)的一组解(x,y). 证明: 假设 

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

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