求最大公约数和最小公倍数

最大公约数和最小公倍数

最大公约数

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。

使用穷举法求最大公约数
			//参数代入两个整型数
public int Gcd(int a,int b){
    	//求出a,b两数的最小数赋值给min
    	//因为两个数的最大公约数最大也就是两数中的小数
        int min = a<b?a:b;
    	//gcd就是最后返回的最大公约数
        int gcd = 1;
    	//循环,从小往大
        for(int i=1;i<=min;i++){
            //当i可以整除两数时,i就是两数的公因子
            if(a%i==0 && b%i==0)
                gcd = i;
        }
    	//返回最大公约数
        return gc;
    }

穷举法太过粗暴,我们可以加入一些算法,使其精简

使用欧几里得算法(Euclidean Algorithm)

欧几里得算法 指的是(a,b)的任何公约数必定是 a − k b = r a-kb=r akb=r的因子

​ a可以表示为 a = k b + r a=kb+r a=kb+r(a,b,k,r皆为正整数,且r≠0)

​ 假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被整除

​ 而 r = a − k b r=a-kb r=akb,两边同时除以d, r ÷ d = a ÷ d − k b ÷ d r\div d=a\div d-kb\div d r÷d=a÷dkb÷d,由等式右边可得, r ÷ d r\div d r÷d是整数,因此d|r

​ 因此d也是(b,a mod b)的公约数

​ (a,b)和(b,a mod b)的公约数相同,则最大公约数也相等

我们可以通过一个例子来了解,求gcd(190,34)

首先用两数的小者34去除两数的大者190,得到:
190 = 5 × 34 + 20 190=5\times34+20 190=5×34+20
34和190的任何公约数也必定是 190 − 5 × 34 = 20 190-5\times 34=20 1905×34=20的因子,而且20和34的任何公约数也必定是 5 × 34 + 20 = 190 5\times 34+20=190 5×34+20=190的因子。因此34和190的最大公约数与20和34的最大公约数相同。
34 = 1 × 20 + 14 34=1\times 20+14 34=1×20+14
同理,gcd(34,20)=gcd(20,14),接着用14除以20

20 = 1 × 14 + 6 20=1\times 14+6 20=1×14+6,继续用6除以14

14 = 2 × 6 + 2 14=2\times 6+2 14=2×6+2,继续用2除以6

6 = 3 × 2 + 0 6=3\times 2+0 6=3×2+0,因为6整除2,所以gcd(6,2)=2

由于gcd(190,34)=gcd(34,20)=gcd(20,14)=gcd(14,6)=gcd(6,2)-2,最初的问题得解gcd(190,34)=2

算法

我们可以把他写成算法

//(a,b)为求最大公约数的两个整数
public int Gcd(int a,int b){
    if(a%b==0) return b;
    else{
        return Gcd(b,a%b);
    }
}
  • 有的朋友可能疑惑要不要确保 a > b a>b a>b这个问题,其实是没有问题的,接着那上面的例子来说gcd(34,190)

34 = 0 × 190 + 34 34=0\times 190+34 34=0×190+34那么就会返回gcd(190,34),所以没必要确保 a > b a>b a>b

这就是欧几里算法,大大减少了计算量,是个优秀的算法

最小公倍数

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。

使用穷举法求最小公倍数
public int Lcm(int a,int b){
    //求出a,b两数的最大数赋值给max
    //因为两个数的最小公倍数最小也就是两数中的大数
    int max = a>b?a:b;
    //lcm就是最后返回的最小公倍数
    int lcm = max;
    //循环
    for(int i=max;i<=(a*b);i++){
        //当i第一次被a,b整除时,i就是a,b的最小公倍数
        if(i%a==0 && i%b==0){
            lcm = i;
            //跳出循环
            break;
        }
    }
    //返回最小公倍数
    return lcm;
   }

穷举法太过粗暴,我们可以找到一个快捷的方法

用最大公约数求最小公倍数

a × b = g c d ( a , b ) × l c m ( a , b ) a\times b=gcd(a,b)\times lcm(a,b) a×b=gcd(a,b)×lcm(a,b)

可知a和b的乘积等于a,b的最大公约数和最小公倍数的乘积

所以
l c m ( a , b ) = a × b ÷ g c d ( a , b ) lcm(a,b)=a\times b\div gcd(a,b) lcm(a,b)=a×b÷gcd(a,b)

public int Lcm(int a,int b){
	return a*b/gcd(a,b);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值