题目链接:https://cn.vjudge.net/problem/UVA-11827
参考博客:https://blog.csdn.net/lxpaopao/article/details/45440037
题意:给你几个数字,让你求出在这几个数中的任意两个数的最大公约数最大的
思路:由于数据规模小,直接暴力即可。但是需要注意到输入技巧
不给有多少个数,所以要字符输入,判断到回车时结束。此外,每个数之间空格也不止一个,要判断一下这个空格是要不要记录数据。
欧几里得 参考博客:https://blog.csdn.net/qq_27599517/article/details/50888092
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int gcd(int a,int b){//求最大公约数 欧几里得算法 辗转相除法
return b?gcd(b,a%b):a;
}
int a[105];
int main(){
int t;
char c;
cin>>t;
while(getchar()!='\n');//区分测试案例个数
while(t--){
int k=0;
//只要没遇到结束符就算同一组测试案例
while((c=getchar())!='\n')//当时少写了一个括号导致结果运行不出来
{
//以字符的方式输入 需要判断是不是数组 空格区分
if(c>='0'&&c<='9'){
ungetc(c,stdin);
/*只要是数字,不是空格,将字符c退回到输入流,当作同一个数字输入
例如:123 456两个数字
654 321--> 这样我们先读到字符1,发现时数字,将
其退回到输入流再执行scanf不久把123一起读进来
*/
scanf("%d",&a[k++]) ;
//将输入的字符转化为数字,存入数组,字符默认从0开始
}
}
int max=0;
//暴力组合
for(int i=0;i<k;i++){
for(int j=i+1;j<k;j++){
int t=gcd(a[i],a[j]);
if(t>max)max=t;//不断更新任意两个数的最大公约数最大的
}
}
cout<<max<<endl;
}
return 0;
}