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

求最大公约数有暴力法和辗转相除法

时间复杂度

暴力: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     {
 8         temp = a;
 9         a = b;
10         b = temp;
11     }
12     while(a % b)
13     {
14         r = a%b;
15         a = b;
16         b = r;
17     }
18     return b;
19 }
20
21 int main()
22 {
23     int a, b, answer;
24     scanf("%d%d",&a,&b);
25     answer = gcd(a,b);
26     printf("%d\n",answer);
27     return 0;
28 }
时间: 2024-10-12 05:56:03

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

用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

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

预备知识 因子(除数) 如果有整数 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既不是素数,也不是合

欧几里德算法(最大公约数算法)完整分析

欧几里德算法又称为辗转相除法,用于计算两个非负整数的最大公因数.其伪代码如下: gcd(a, b) //要求保证传入的a>=b if(b == 0) return a return gcd(b, a % b) 首先说明这个函数能返回a与b的最大公因数.但是我们不从代码到原理,我们要从原理返回代码.(下面的出现的所有符号均为非负整数) 在a与b均非0且a>=b的情况下,若c是a和b的最大公因数(c>0),那么就有c|a和c|b的同时成立.显然a=i*c,b=j*c,此处应满足1<=j

欧几里德算法(求最大公因数)

//说明: //欧几里德算法:计算两个证书的最大公因数(假设M>N) //输入:M,N //输出:最大公因数 #include<iostream> using namespace std; void main() { cout<<"Input M and N:"<<endl; int M,N; cin>>M>>N; int rem; while(N>0) { rem=M%N; M=N; N=rem; } cout&

浅谈Stein算法求最大公约数(GCD)的原理及简单应用

一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: s3:用更相减损法(辗转相减法),即GCD(a,b)=GCD(a-b,b)求出两奇数的最大公约数d: s4:原来两数的最大公约数即为d*k: 2.简单证明: s1:即为求出两数为2的幂次方的最大公因数k: s2:当化简后两数一奇一偶时,显然奇数是不含偶数因子的,那么另一化简后偶数的所有偶数因子都不

POJ1061-青蛙的约会---扩展欧几里德算法求最小整数解

扩展欧几里得算法模板 #include <cstdio> #include <cstring> #define ll long long using namespace std; ll extend_gcd(ll a, ll b, ll &x, ll &y) { if(b == 0) { x = 1, y = 0; return a; } else { ll r = extend_gcd(b, a%b, y, x); y -= x*(a/b); return r;

拓展欧几里德算法求逆元2

1 void gcd(int a,int b,int &d,int &x,int &y) 2 { 3 if(!b) 4 { 5 d=a; 6 x=1; 7 y=0; 8 } 9 else 10 { 11 gcd(b,a%b,y,x); 12 y-=x*(a/b); 13 } 14 } 15 16 //计算模n下a的逆元,如果不存在逆元,返回-1 17 int inv(int a,int n) 18 { 19 int d,x,y; 20 gcd(a,n,d,x,y); 21 retu

扩展欧几里德算法求逆元3

1 int gcd(int x3,int y3) 2 { 3 int x1 = 1,x2 = 0,y1 = 0,y2 = 1; 4 while(1) 5 { 6 if (y3==1) return y2; 7 int q=x3/y3; 8 int t1=x1-q*y1,t2=x2-q*y2,t3=x3-q*y3; 9 x1 = y1,x2 = y2,x3 = y3; 10 y1 = t1,y2 = t2,y3 = t3; 11 } 12 }

两非负整数求最大公约数(欧几里德算法)---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