UVa11827(欧几里得算法)

来源:互联网 发布:淘宝宝贝详情图片素材 编辑:程序博客网 时间:2024/06/05 08:07

题目链接: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;}


1 0
原创粉丝点击