gcd最大公约数
辗转相除法
但是上面会存在一个问题:
就是当两个个数太大了时候(bigInt),使用%就不太合适,会导致耗时长、消耗大。
解决方法:
暂且叫它为辗转相减法~~(自创的)
但还是会存在问题:
注意事项:
第一个辗转相除法是不用考虑输入x和y的前后位置。
第二个辗转相减法要考虑x和y的大小
代码如下:
//
// Created by luozongwei on 2022/5/15.
//
# include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int x, int y) {
return (!y) ? x : gcd(y, x%y);
}
int gcd_sub(int x, int y){
if (x < y) return gcd_sub(y, x);
else if (y == 0) return x;
else return (!y) ? x : gcd_sub(y, x - y);
}
bool isEven(int x) {
if(x % 2 == 0) return true;
else return false;
}
int gcd_min(int x, int y) {
// 因为用到了减法,所以要保证x > y
if(x < y) gcd_min(y, x);
else if(y == 0) return x; // 这个递归出口
else {
if(isEven(x)) {
if(isEven(y)) return 2* gcd_min(x>>1, y>>1);
else return gcd_min(x>>1, y);
}else {
if(isEven(y)) return gcd_min(x, y>>1);
else return gcd_min(y, x-y);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int x, y;
x = 30, y = 18;
cout << gcd_min(x, y) << endl;
cout << gcd_min(y, x) << endl;
return 0;
}