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;
}


你可能感兴趣的:(数据,数学)