最大公约数和最小公倍数

1. 求两数的最大公约数(greatest common divisor)和最小公倍数(least common multiple)
a = m * gcd(a,b), b = n * gcd(a,b) => lcm(a,b) = m * n * gcd(a,b) = a * b / gcd(a,b)
求最大公约数的常见方法有欧几里得法(辗转相除法)和最简单的循环找最大除数法

1) 欧几里得法:利用 m、n和n、(m % n)之间的最大公约数相同的原理,通过方法,在m%n=0的时候得到最大公约数.
    证明:假设m>n, 令m = k*n + r, 若最大公约数为p, 则p|m, p|n, r = m-k*n,所以p|r,得证.
    实例:求481 221的最大公约/因数
    ------解:481 = 221*2 + 39, 221 = 39*5 + 26, 39 = 26*1 + 13, 26 = 13*2 + 0; 可知最大公因数 =  13
//递归法
int getGCD(int m, int n) {
    if (m < n) { //保证m>n,如果m<n则进行数据交换
        int temp = m;
        m = n;
        n = temp;
   }
   if (m % n == 0)
        return n;
   else
        return getGCD(n, m % n);
}

2) 循环法求最大公约数
  a) 
int getGCD(int m, int n) {
     if (m < n) { //保证m>n,如果m<n则进行数据交换
         int temp = m;
         m = n;
         n = temp;
     }
     while (m % n != 0) {
         int temp = m % n;
         m = n;
         n = temp;
     }
     return n;
}
 
  b)
int getGCD(int m, int n) { //这种方法有个弊端,如果其中一个数大于32位的话,运算就会非常耗时
    if (m < n) { //保证m>n,如果m<n则进行数据交换
        int temp = m;
        m = n;
        n = temp;
    }
    int gcd = 1;
    for (int i = n; i > 0; i --) {
        if (n%i == 0 && m%i == 0) {
            gcd = i; break;
        }
     }
     return gcd;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值