题目描述
求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
示例1
输入: 3,6
返回值:3
示例2
输入:8,12
返回值:4
解题方法
一、辗转相除法
class Solution {
public:
int gcd(int a, int b) {
int max=a>b?a:b;
int min=a<b?a:b;
if(max%min==0)return min;
else{ return gcd(min,max%min);}
}
};
二、更相减损法
例、用更相减损术求98与63的最大公约数。
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。
递归实现
class Solution {
public:
int gcd(int a, int b) {
int max=a>b?a:b;
int min=a<b?a:b;
if(max % min == 0) return min;
return gcd(max - min, min);
}
};
非递归实现
class Solution {
public:
int gcd(int a, int b) {
while(a!=b)
{
if(a>b){a-=b;}
else b-=a;
}
return a;
}
}
};