UVa11827(欧几里得算法)
Posted leader_win
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa11827(欧几里得算法)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/F;
关于欧几里得和扩展欧几里得算法请参阅:http://blog.csdn.net/qq_27599517/article/details/50888092;
题意:题目很简单,给出一组数求两两之间最大的最大公约数;
分析:这道题恶心在不给有多少个数,所以要字符输入,判断到回车时结束。此外,每个数之间空格也不止一个,要判断一下这个空格是要不要记录数据。我的做法是用字符输入,如果是数字就用sum把值记录下来,如果是空格,就判断sum是否为0是就继续循环输入,不是就把sum记录到数组里,在循环。
此外,在结尾的时候还要判断最后一个字符(回车除外)是否是数字,是数字的话就要再记录当前sum不是的话,sum=0就不用记录了;总之,数组内没有得0的值
代码如下:
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <vector>
#include <utility>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
long long gcd(long long a,long long b){
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
long long t;
cin>>t;
getchar();
while(t--){
long long a[1005];
char s;
long long k=0;
long long sum=0;
while(1){
scanf("%c",&s);
if(s=='\\n'){
break;
}
else if(s>='0'&&s<='9'){
sum*=10;
sum+=(long long)(s-'0');
}
else{
if(sum==0)continue;
else{
// cout<<sum<<" "<<k<<endl;
a[k++]=sum;
sum=0;
}
}
}
if(sum!=0)
a[k++]=sum;
long long maxx=1;
for(long long i=0;i<k;i++)
for(long long j=0;j<i;j++){
maxx=max(maxx,gcd(a[i],a[j]));
}
cout<<maxx<<endl;
}
return 0;
}
以上是关于UVa11827(欧几里得算法)的主要内容,如果未能解决你的问题,请参考以下文章