题目链接: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; }
时间: 2024-10-13 00:53:40