这个是最经典的数字的问题,在很多地方都能见到这个题目
求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
第一种思路是根据最大公约数的定义,辗转相除法,从比较小的整数开始,向下–,直到找到满足要求的整数,如果都不满足,就返回1. 这样做的运算量比较大,效率比较低,更高效一点的是更相减损术。
1. 辗转相除法
public int gcd (int a, int b) {
// write code here
int min=a>b?b:a;
for(int i=min;i>=1;i--){
if(a%i==0 && b%i==0){
return i;
}
}
return 1;
}
2. 更相减损数
上面的方式需要进行大量的取模运算,一种更为简单的方式是只用减法:
public int gcd (int a, int b) {
// write code here
while(a != b){
if(a > b)
a -= b;
else
b -= a;
}
return a;
}