求最大公约数(C语言实现)
0、暴力穷举法
暴力穷举是最不推荐的算法,因为他的时间复杂度是最高的
int GCD(int a, int b) {
if(a < b) {
int c = a;
a = b;
b = c;
}
for(int i=b; i>0; i--) {
if (a % i == 0 && b % i == 0) return i;
}
return 1;
}
一、辗转相减法
int GCD(int a, int b) {
while (a != b) {
if (a > b) a -= b;
else b -= a;
}
return a;
}
二、更相减损术
更相减损法来自《秦九昭算数》,与辗转相减法的区别在于先把两个值置为奇数
int GCD(int a, int b) {
while(a%2==0) {
a/=2;
}
while(b%2==0) {
b/=2;
}
while(a!=b) {
if(a>b) a=a-b;
else b=b-a;
}
return a;
}
三、辗转相除法
递归法又叫欧几里得算法,计算公式gcd(a,b) = gcd(b,a mod b)
int GCD(int a, int b) {
int c;
if(a < b) {
c = a;
a = b;
b = c;
}
while(b != 0) {
c = b;
b = a % b;
a = c;
}
return a;
}
四、递归法
递归法本质上还是辗转相除法
int GCD(int a,int b) {
if(a > b) {
if(a % b == 0) return b;
else return GCD(b,a%b);
}
else {
if(b % a == 0) return a;
else return GCD(a,b%a);
}
}