• 高精度gcd


    高精度gcd

    例题

    洛谷P2152 [SDOI2009]SuperGCD

    更相减损&不压位

    Code

    #include<iostream>
    using namespace std;
    string str1,str2;
    const int maxn=10001;
    int a[maxn],b[maxn],c[maxn];
    bool cmp1()
    {
        for(int i=maxn-1;i>=0;i--)
        {
            if(a[i]>b[i]) return true;
            if(a[i]<b[i]) return false;
        }
        return true;
    }
    bool judge()
    {
        for(int i=0;i<maxn;i++)
            if(a[i]) return false;
        return true;
    }
    void swap_array()
    {
        for(int i=0;i<maxn;i++) swap(a[i],b[i]);
    }
    void gcd()
    {
        if(!cmp1()) swap_array();
        for(int i=0;i<maxn;i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i+1]-=1;
                a[i]+=10;
            }
        }
        if(!judge()) gcd();
        return;
    }
    int main()
    {
        cin>>str1>>str2;
        for(int i=0;i<str1.size();i++) a[str1.size()-i-1]=str1[i]-'0';
        for(int i=0;i<str2.size();i++) b[str2.size()-i-1]=str2[i]-'0';
        gcd();
        bool s=0;
        for(int i=maxn-1;i>=0;i--)
        {
            if(b[i]) s=1;
            if(s==1) cout<<b[i];
        }
        return 0;
    }

    Attention

    很容易TLE

    P2152只有46分

    optimize

    由于两个数的位数是会越来越少的,所以将变量e保存当前a数组的位数,每次计算前先看看变量e可不可以更新。

    然后再for循环的起点或边界条件设置为e(用e代替maxn)即可

    Code

    #include<iostream>
    using namespace std;
    string str1,str2;
    const int maxn=10001;
    int e=maxn;
    int a[maxn],b[maxn],c[maxn];
    void update()
    {
        for(int i=e+1;i>=0;i--) if(a[i]) {e=i+1;return;}
    }
    bool cmp1()
    {
        for(int i=e;i>=0;i--)
        {
            if(a[i]>b[i]) return true;
            if(a[i]<b[i]) return false;
        }
        return true;
    }
    bool judge()
    {
        for(int i=0;i<e;i++)
            if(a[i]) return false;
        return true;
    }
    void swap_array()
    {
        for(int i=0;i<e;i++) swap(a[i],b[i]);
    }
    void gcd()
    {
        if(!cmp1()) swap_array();
        update();
        for(int i=0;i<e;i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i+1]-=1;
                a[i]+=10;
            }
        }
        if(!judge()) gcd();
        return;
    }
    int main()
    {
        cin>>str1>>str2;
        for(int i=0;i<str1.size();i++) a[str1.size()-i-1]=str1[i]-'0';
        for(int i=0;i<str2.size();i++) b[str2.size()-i-1]=str2[i]-'0';
        gcd();
        bool s=0;
        for(int i=e-1;i>=0;i--)
        {
            if(b[i]) s=1;
            if(s==1) cout<<b[i];
        }
        return 0;
    }

    Attention

    这种小优化只能得64分~还是有点用的嘛!

     

  • 相关阅读:
    7. 整数反转
    14. 最长公共前缀
    13. 罗马数字转整数
    从web解析到网络空间
    python实例:霍兰德人格分析雷达图
    从数据处理到人工智能
    Python第三方库的安装
    Python之os库的使用
    Python第三方库的安装
    Python程序设计思维
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11644236.html
Copyright © 2020-2023  润新知