zoukankan      html  css  js  c++  java
  • 高精度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分~还是有点用的嘛!

     

  • 相关阅读:
    八张图读懂未来“互联网+”的六大趋势
    跑一段代码遍历所有汉字
    PHP业务逻辑层和数据访问层设计
    漫谈社区PHP 业务开发
    以Apache服务器、php语言为例 详解动态网站的访问过程
    sublime text
    《产品经理的20堂必修课》
    检测文件是否有bom头
    利用开源框架Volley来下载文本和图片。
    往SD卡中写文件的方法。
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11644236.html
Copyright © 2011-2022 走看看