码迷,mamicode.com
首页 > 其他好文 > 详细

辗转相除法

时间:2017-08-26 22:10:33      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:class   a*   自然数   using   实现   int   bsp   最大   大小   

辗转相除法求最大公约数

①假设a,b两个自然数,先判断a,b的大小,用a存大的,b存小的。

②a/b=q…r,把b乘到等式右边,即a=q*b+r,假设r(n)一直不等于0,会得到

b=q1*r+r1

r=q2*r1+r2

r1=q3*r2+r3

……  ……

一直到r(n)等于0,则r(n-1)为最大公约数。如,r3为0,则

r1=q3*r2,则r=q2*q3*r2+r2,即r=r2*(q2*q3+1);

所以r2是a,b的最大公约数。

代码实现

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a,int b);
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    if(a<b){
        swap(a,b);
    }
    printf("%d\n",gcd(a,b));
    return 0;
}
int gcd(int a,int b){
if(a%b!=0){
    return gcd(b,a%b);
}
else
    return b;
}

这是求最大公约数的非常高效的算法,其复杂度是O(log max(a,b))以内,不过我不是很会分析。。

 

既然有了最大公约数,那么就可以求出最小公倍数,最小公倍数:a*b/最大公约数

因为a/最大公约数就剩下了它最小的约数,b也是如此,所以最大公约数*a剩下的最小约数*b剩下的最小约数即为最小公倍数。

 

 

 

 

 

 

 

 

 

 

  

 

辗转相除法

标签:class   a*   自然数   using   实现   int   bsp   最大   大小   

原文地址:http://www.cnblogs.com/LuRenJiang/p/7436437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!