• 1627:【例 3】最大公约数


    1627:【例 3】最大公约数


    时间限制: 1000 ms         内存限制: 524288 KB
    提交数: 592     通过数: 72

    【题目描述】

    给出两个正整数 A,B

    ,求它们的最大公约数。

    【输入】

    输入共两行,第一行一个正整数 A

    ,第二行一个正整数 B

    【输出】

    在第一行输出一个整数,表示 A,B

    的最大公约数。

    【输入样例】

    18
    24

    【输出样例】

    6

    【提示】

    数据范围与提示:

    对于 60% 的数据,1A,B1018

    对于 100% 的数据,1A,B103000

    其实这道题就是裸高精,十分的简单,因为我的脑壳有问题打完之后自信满满却发现漏洞百出,调了一个小时才搞好。。。

    #include<bits/stdc++.h>
    using namespace std;
    const int base=10000;
    int a[10000],b[10000],c[10000],f[10000],T;
     void Print(int a[])
    {
        int i,j;
        cout<<a[a[0]];
        for(i=a[0]-1;i>0;i--)
         for(j=base/10;j>0;j/=10) cout<<a[i]/j%10;
    }
     void Init(int a[])
    {
        string s;
        cin>>s;
        int len=s.length(),i,j;
        for(i=0;i<len;i++)
        {
            j=(len-i+3)/4;
            a[j]=a[j]*10+s[i]-'0';
        }
        a[0]=(len+3)/4;
    }
     int Compare(int a[],int b[])
    {
        if(a[0]>b[0]) return 1;
        if(a[0]<b[0]) return -1;
        for(int i=a[0];i>=1;i--)
        {
            if(a[i]>b[i]) return 1;
            else if(a[i]<b[i]) return -1;
        }
        return 0;
    }
     void Div(int a[],int k)
    {
        int i,t=0;
        for(i=a[0];i>=1;i--)
        {
            t=t*base+a[i];
            a[i]=t/k;
            t%=k;
        }
        while(a[a[0]]==0&&a[0]>0) a[0]--;
    }
     void Minus(int a[],int b[])
    {
        for(int i=1;i<=a[0];i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {a[i+1]--;
                a[i]+=base;
                
            }
        }
        while(a[a[0]]==0&&a[0]>0) a[0]--;
    }
    void Gcd(int a[],int b[],int t)
    {
        if(Compare(a,b)==0) 
        {
            T=t;
            return ;
        }
        if(Compare(a,b)<0)
        {
            Gcd(b,a,t);
            return ;
        }
        int ta,tb;
        if(a[1]%2==0){Div(a,2);ta=1;}
        else ta=0;
        if(b[1]%2==0){Div(b,2);tb=1;}
        else tb=0;
        if(ta&&tb) Gcd(a,b,t+1);
        else if(!ta&&!tb)
        {
            Minus(a,b);Gcd(a,b,t);
        }
        else Gcd(a,b,t);
    }
     void MulHigh(int a[],int b[])
    {
        memset(c,0,sizeof(c));
        int i,j;
        for(i=1;i<=a[0];i++)
         for(j=1;j<=b[0];j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/base;
            c[i+j-1]%=base;
        }
        c[0]=a[0]+b[0];
        while(c[c[0]]==0&&c[0]>0) c[0]--;
        for(i=0;i<=c[0];i++) a[i]=c[i];
    }
     void MulLow(int a[],int k)
    {
        int i;
        for(int i=1;i<=a[0];i++)
        {
            a[i]*=k;
        }
        for(int i=1;i<=a[0];i++)
        {
            a[i+1]+=a[i]/base;
            a[i]%=base;
        }
        while(a[a[0]+1]>0)
        {
            a[0]++;
            a[a[0]+1]=a[a[0]]/base;
            a[a[0]]%=base;
        }
    }
    int main()
    {
        Init(a);Init(b);
        Gcd(a,b,0);
        if(T==0) Print(a);
        else
        {
            f[0]=f[1]=1;
            for(int i=1;i<=T;i++) MulLow(f,2);
            MulHigh(f,a);
            Print(f);
        }
        return 0;
    }
  • 相关阅读:
    第十一周项目6-回文&素数(一)
    第十一周项目1-函数版星号图(三) .
    囚徒困境 For BBasic
    第十一周项目5-当年第几天
    第十一周项目4-特殊三位数
    第十一周项目3-程序的多文件组织
    第十一周项目2-求最大公约数
    第十一周项目1-函数版星号图(二)
    第十一周项目1-函数版星号图(一)
    第十周-囚徒困境
  • 原文地址:https://www.cnblogs.com/smartljy/p/11392570.html
Copyright © 2020-2023  润新知