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

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a,b;
int gcd(int a,int b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    cin>>a>>b;
    cout<<gcd(a,b);
    return 0;
}

对于任意a,b∈N, b≠0,gcd(a,b)=gcd(b,a mod b)

复杂度 O(log(a+b)

原文地址:https://www.cnblogs.com/lcezych/p/10540620.html

时间: 2024-11-07 10:47:19

欧几里得算法求最大公约数模板的相关文章

欧几里得算法求最大公约数(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,两个数互质:如果说两个数的公因数只有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; 所以由以上的推论,我

对分查找、欧几里得算法求最大公约数

对分查找 1 int BinarySearch(const int A[], int x, int N) 2 { 3 int low, mid, high; 4 low = 0, high = N - 1; 5 while(low <= high) 6 { 7 mid = (low + high) / 2; 8 if(A[mid] < x) 9 low = mid + 1; 10 else 11 if(A[mid] > x) 12 high = mid - 1; 13 else 14 r

关于欧几里得算法求最大公约数,即OJ1029的参考解法

1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 int a,b,c; 5 scanf("%d %d",&a,&b); 6 while(b>0) 7 { 8 c=a%b; 9 a=b; 10 b=c; 11 } 12 printf("%d\n",a); 13 return 0; 14 }

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

1 #include <iostream> 2 using namespace std; 3 4 int gcd(int m , int n) 5 { 6 int r; 7 while(n!=0) 8 { 9 r = m%n; 10 m = n; 11 n = r; 12 gcd(m,n); 13 } 14 return m; 15 } 16 17 int main(int argc, char* argv[]) 18 { 19 cout << gcd(4,2) <<

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

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

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

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

欧几里得算法求两个整数的最大公因数

unsigned int Gcd (unsigned int m,unsigned int n){ unsigned int rem; while(n>0){ rem = m % n; m = n; n = rem; } return m; } 对于m<n的情况,第一次循环m,n会交换 算法的时间复杂度计算 时间复杂度 logn 若M > N,则第一次循环交换M和N. 若想分析其时间复杂度,则要求循环次数,即生成余数的次数. 可以证明: 当M > N, 则M % N < M

拓展欧几里得算法求不定方程

对于 ax+by=gcd(a,b) 这样的方程,可以用扩展欧几里得算法exgcd求出一组通解. 根据欧几里得求gcd: gcd(a,b)=gcd(b,a%b) 可得 bx+(a%b)y=gcd(b,a%b) 根据 a%b=a−(a/b)∗b 可得 bx+ay−(a/b)b∗y=gcd(b,a%b) 化简得 ay+b(x−(a/b)y)=gcd(b,a%b) x′=y,y′=(x−(a/b)y) ax′+by′=gcd(b,a%b)<=>ax+by=gcd(a,b) 根据 gcd(a,0)=a