高精度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分~还是有点用的嘛!

 

 

 

posted @ 2019-10-09 21:12  Vanilla_chan  阅读(308)  评论(0编辑  收藏  举报