B3736 [信息与未来 2018] 最大公约数 题解
这里我们提供两种解决方案。
暴力枚举
我们注意到这道题的数据特别小,所以考虑暴力枚举。那么,怎么枚举?很简单,我们从
那么,为什么要从
然后来说一下判断条件。我们首先要判断
如果还有什么不懂的就直接看代码吧。
#include<bits/stdc++.h>//万能头文件
using namespace std;
long long x, y, z;
int main(){
cin>>x>>y>>z;
for(int i=1e6;i>=1;i--){//从 1e6 枚举到 1
if(i>x && i>y && i>z) continue;//如果 i 大于 x,y,z,那么一定就不能 mod 了,所以 continue 掉
else if(x%i==0 && y%i==0 && z%i==0){//如果符合条件
cout<<i<<endl;//输出 i
return 0;//结束程序
}
}
return 0;//结束程序
}
时间复杂度为
用最大公因数函数
如标题,C++ 里有一个求最大公因数的函数。这个函数就是__gcd(x,y)。前面是两个下划线。
还要注意一点,就是这个函数里面只能放相同类型的变量。
那么如何使用这个函数呢?我们可以先求出前两个数的最大公因数。然后求前两个数的最大公因数和最后一个数的最大公因数。
最后输出就好了。
如果还有什么不懂的就直接看代码吧。
#include<bits/stdc++.h>//万能头文件
using namespace std;
int x, y, z;
int main(){
cin>>x>>y>>z;
int cd=__gcd(x,y);//求前 x 和 y 的最大公因数,并存入一个叫 cd 的变量
int gcd=__gcd(cd,z);//求 cd 和 z 的最大公因数
cout<<gcd<<endl;//输出
//这里再补充一下吧,就是__gcd函数里面只能放相同类型的变量,比如我放两个 int 或两个 long long
return 0;//结束程序
}
时间复杂度为对数级别。
结尾
好了,两种方法都讲完了,在时间复杂度上显然第二种最优。但是第一种的代码更好写。所以两种思路都要看一下。这里建议大家用第二种方法,因为如果数据很大的话暴力是过不了的。
如果有什么写的不好的就私信我,我会第一时间改正。