专栏文章
B3736 [信息与未来 2018] 最大公约数 题解
B3736题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miq99o5y
- 此快照首次捕获于
- 2025/12/04 01:03 3 个月前
- 此快照最后确认于
- 2025/12/04 01:03 3 个月前
这里我们提供两种解决方案。
暴力枚举
我们注意到这道题的数据特别小,所以考虑暴力枚举。那么,怎么枚举?很简单,我们从 枚举到 1,然后进行一些判断。
那么,为什么要从 枚举到 1,而不是从 1 枚举到 呢?注意到要求最大公因数,所以从大到小枚举是不错的选择。当然,如果从 1 开始枚举,那么代码永远只会输出 1。
然后来说一下判断条件。我们首先要判断 是不是小于 。因为如果大于,就不能 mod 了。然后根据题目判断就行了。
如果还有什么不懂的就直接看代码吧。
CPP#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)。前面是两个下划线。还要注意一点,就是这个函数里面只能放相同类型的变量。
那么如何使用这个函数呢?我们可以先求出前两个数的最大公因数。然后求前两个数的最大公因数和最后一个数的最大公因数。
最后输出就好了。
如果还有什么不懂的就直接看代码吧。
CPP#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;//结束程序
}
时间复杂度为对数级别。
结尾
好了,两种方法都讲完了,在时间复杂度上显然第二种最优。但是第一种的代码更好写。所以两种思路都要看一下。这里建议大家用第二种方法,因为如果数据很大的话暴力是过不了的。
如果有什么写的不好的就私信我,我会第一时间改正。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...