首先我们要先知道gcd是什么东西?
GCD作为缩写意义有多种。它通常表示最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf)
知道gcd是什么了,我们就可以微笑的说 老子可以跑暴力!!!(暴力美学)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
if(a<b)
swap(a,b);//需要找到最大的,从最大的开始走暴力!
int i;
for(i=a;i>0;i--)
{
if(a%i==0&&b%i==0)
{
cout<<i<<endl;
break;
}
}
return 0;
}
这里swap是交换a,b的值,当然也可以用桶的思想。
暴力一时爽,但也有难受的时候,暴力——》时间可能会很长(时间复杂度)。举个例子:我输入1000000000000 1两个数,暴力for要从1000000000000 跑到 1!
那我们就升级一下,有算法优化我们的代码!
辗转相除法求最大公约数 ————》gcd(a,b) = gcd(b,a mod b)
辗转相除法求最大公约数是一种常用的求两个数的最大公约数的方法。
方法
是:以小数除大数,如果能整除,那么小数就是所求的最大公约数。否则就用余
数来除除数;
再用新除法的余数去除刚才的余数。
依此类推,
直到一个除法能够
整除,这时作为除数的数就是所求的最大公约数。
具体过程如下:
输入正整数
m和n,保证m不小于n; 如果n≠0,则求r=m%n,然后m=n,n=r;重复此操作直到n=0;如n=0则此时m就是最大公约数。
例如:求
4453和5767
的最大公约数时,可作如下除法.
5767÷4453=1余1314
4453÷1314=3余511
1314÷511=2余292
511÷292=1余219
292÷219=1余73
219÷73=3 余0
于是得知,5767和4453的最大公约数是73.
若要求这两个数的最小公倍数,
其值就是这两数之积除以这两数的最大公约
数得到的商。
如果你明白了这个辗转相除的思想,那代码就很容易写出来了!
#include<iostream>
#include<string.h>
using namespace std;
int gcd(int x, int y)
{
if (y == 0)
return x;
else
return gcd(y, x % y); // y/(x%y);
}
int main()
{
int a, b;
cin >> a >> b;
cout << gcd(a, b) << endl;
return 0;
}
代码的运行速度就得到了很大的提升。
当然C++的STL库里面是有求 两个数的最大共约数 的函数——》__gcd(a,b)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<__gcd(a,b)<<endl;
return 0;
}
用STL函数,代码看起来就简洁很多,并且运行速度是很快的!!!
gcd 与 __gcd用哪个还是取决你自己,毕竟有时候我们还会倾向于跑暴力(哈哈!)
我个人倾向于自己封装一个gcd,因为可能会存在一些编译器跑不了__gcd(就比如是vs2019,编译器会友好的提示我"__gcd":找不到标识符。也可能是我本身的问题www,但读者请放心Dev是可以跑__gcd的)。
如果这篇文章对读者您有帮助,请留下您免费的赞(这是对我最大的鼓励!)
同时也欢迎大佬的指点于纠错,我定会虚心接受.
在最后,
再次感谢您的阅读!