算法题:求两个整数的最小公约数和最大公倍数

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

思路:
  求最大公约数
  假设 x 是 m 和 n 的最大公约数, 其中m > n
  那么 m = x * a
      n = x * b

  其中 x a b 都是整数
  我们 用 m 除以 n 取余数, 得出 y = m/n = a/b ,  z = m%n
  如果 y是整数, z余数是0, 则n就是 m和n的最大公约数, 毕竟m能被n整除

  如果 z余数不是0, 则用 n 去除于 z  得出z2 = n%z 不断循环执行这个操作, 知直至余数为0

  例子 假如 M=30 n=12
  1.  m = 32 n = 12 , z = 30%12 = 8
  2.  m2 = 12, n2 = 8 , z2= 12%8 = 4
  3.  m3 = 8,  n3 = 4, z3 = 8%4 = 0
  则 最大公约数是n2 = 6
  ******************************************************

  求最小公倍数
  假设 x 是 m 和 n 的最大公约数
   那么 m = x * a
       n = x * b

   其中 a b 互质 (最大公约数是1)
   则最小公倍数 y = a * b * x
   也就是讲 y = m * n / x   (x 是 m n 的最大公约数)

python 代码:

class DivisorMultiple:

    def __init__(self, int_m: int, int_n: int):
        self.m = int_m
        self.n = int_n

    def get_max_divisor(self):
        """
        Returns:
            int , the max divisor from m n
        """
        if self.m == self.n:
            return self.m

        self.swap()
        m1 = self.m
        n1 = self.n
        z1 = m1 % n1
        while z1 != 0:
            m1 = n1
            n1 = z1
            z1 = m1 % n1

        # z == 0
        return n1

    def swap(self):
        """
        make the m to be greater value, if n > m , then swap them
        Returns:
            None
        """
        if self.m < self.n:
            tmp = self.m
            self.m = self.n
            self.n = tmp
        return


if __name__ == __main__:
    m = 32
    n = 12
    dm1 = DivisorMultiple(m, n)
    z = dm1.get_max_divisor()
    print("The max divisor of {} and {} is {} , the min multiple of them is {}".format(m, n, z, int(m * n / z)))

java 代码:

public class DivisorMultiple {
          
   
    public static void main(String[] args) {
          
   
        int m = 32; int n = 12;
        int z = new DivisorMultipleUtil(n, m).getMaxDivisor();
        System.out.println(MessageFormat.format("The max divisor of {0} and {1} is {2} , the min multiple of them is {3}",
                                                m,n,z,(m * n/ z)));
    }
}

@AllArgsConstructor
class DivisorMultipleUtil{
          
   
    private int m;
    private int n;

    /**
     * 
     * @return int , the max divisor from m n
     */
    public int getMaxDivisor(){
          
   
        this.swap();
        if (m == n){
          
   
            return m;
        }

        int m1 = m; int n1 = n; int z1 = m1 % n1;
        while (0 != z1){
          
   
            m1 = n1; n1 = z1; z1 = m1 % n1;
        }

        // z1 == 0
        return n1;
    }

    /**
     * make the m to be greater value, if n > m , then swap them
     */
    private void swap(){
          
   
        if (m < n){
          
   
            int t = m;
            m = n;
            n = t;
        }
    }

}
经验分享 程序员 微信小程序 职场和发展