公约数定义

公约数,亦称“公因数”。它是一个能被若干个整数同时均整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。

问题背景

  1. 求两个数的最大公约数
  2. 求多个数的最大公约数
  3. 求多个数的公约数

问题2、3其实质上也就是问题1的转化。
求2可以先求出其中两个数的最大公约数,将这个最大公约数同第三个数接着求其二者最大公约数,依次求解,即可得到多个数的最大公约数。
求3可以求出2,其最大公约数的公约数即是问题的解。

算法

辗转相减法

求a、b的最大公约数
当a>b时,若a中含有与b相同的最大公约数,那么a-b中也有与b相同的最大公约数。
当a<b时,若a中含有与b相同的最大公约数,那么b-a中也有与a相同的最大公约数。
直到a=b为止,此时a或b就是最大公约数。

  public int Gcd(int a,int b){
   
        if(a<0||b<0) return -1;
        if(a==b) return a;
        else if(a>b)  return Gcd(a-b,b);
        else return Gcd(a,b-a);
    }

辗转相除法

求a、b的最大公约数
对正整数a,b进行连续的求余运算,直到余数为0为止,此时非0的除数就是最大公约数。
即Gcd(a,b)=Gcd(b,r) r=a%b
例如50和15的最大公约数Gcd(50,15)=Gcd(15,5)=Gcd(5,0)

public  int Gcd1(int a,int b){
   
        if(a<0||b<0) return -1;
        int r=0;
        while (a%b!=0){
   
            r=a%b;
            a=b;
            b=r;
        }
        return b;
    }```