首页 > 其他 > 详细

高精度模板汇总

时间:2020-09-12 22:50:20      阅读:52      评论:0      收藏:0      [点我收藏+]

高精加高精

很简单,直接做就行了

string S;
struct GJ{
    int s[N],L;
    void Print()
        {
            for(int i=L;i>1;--i)
                printf("%d",s[i]);
            printf("%d\n",s[1]);
        }
}blank,A,B,Ans;
GJ operator +(GJ X,GJ Y)
{
    GJ mid=blank;
    mid.L=max(X.L,Y.L);
    for(int i=1;i<=mid.L;++i)
    {
        mid.s[i]+=X.s[i]+Y.s[i];
        mid.s[i+1]+=mid.s[i]/10;
        mid.s[i]%=10;
    }
    if(mid.s[mid.L+1])mid.L++;
    return mid;
}
int main()
{
    cin>>S;A.L=S.length();
    for(int i=0;i<A.L;++i)
        A.s[A.L-i]=S[i]-‘0‘;
    cin>>S;B.L=S.length();
    for(int i=0;i<B.L;++i)
        B.s[B.L-i]=S[i]-‘0‘;
    Ans=A+B;
    Ans.Print();
    return 0;
}

高精减高精

注意一下判断高精的大小关系
我偷懒就直接用string的库函数了。。。

string S1,S2;
struct GJ{
    int s[N],L;
    void Print()
        {
            for(int i=L;i>1;--i)
                printf("%d",s[i]);
            printf("%d\n",s[1]);
        }
}blank,A,B,Ans;
GJ operator -(GJ X,GJ Y)
{
    GJ mid=blank;
    mid.L=max(X.L,Y.L);
    for(int i=1;i<=mid.L;++i)
    {
        mid.s[i]+=X.s[i]-Y.s[i];
        if(mid.s[i]<0)
            mid.s[i+1]--,mid.s[i]+=10;
    }
    while(!mid.s[mid.L]&&mid.L>1)mid.L--;
    return mid;
}
int main()
{
    bool flag=0;
    cin>>S1;A.L=S1.length();
    cin>>S2;B.L=S2.length();
    if(A.L<B.L||(A.L==B.L&&S1<S2))
    {
        swap(S1,S2);
        swap(A.L,B.L),flag=1;
    }
    for(int i=0;i<A.L;++i)
        A.s[A.L-i]=S1[i]-‘0‘;
    for(int i=0;i<B.L;++i)
        B.s[B.L-i]=S2[i]-‘0‘;
    Ans=A-B;
    if(flag)putchar(‘-‘);
    Ans.Print();
    return 0;
}

高精乘高精

小数的话先把小数点抠出来,在答案里加进去就ok
负数的话特判一下就可以了

char S[N];
struct GJ{
    int s[N],L;
    void Print()
        {
            for(int i=L;i>1;--i)
                printf("%d",s[i]);
            printf("%d\n",s[1]);
        }
}blank,A,B,Ans;
GJ operator *(GJ X,GJ Y)
{
    GJ mid=blank;
    mid.L=X.L+Y.L;
    for(int i=1;i<=X.L;++i)
        for(int j=1;j<=Y.L;++j)
        {
            mid.s[i+j-1]+=X.s[i]*Y.s[j];
            mid.s[i+j]+=mid.s[i+j-1]/10;
            mid.s[i+j-1]%=10;
        }
    while(!mid.s[mid.L]&&mid.L>1)mid.L--;
    return mid;
}
int main()
{
    cin>>S;A.L=strlen(S);
    for(int i=0;i<A.L;++i)
        A.s[A.L-i]=S[i]-‘0‘;
    cin>>S;B.L=strlen(S);
    for(int i=0;i<B.L;++i)
        B.s[B.L-i]=S[i]-‘0‘;
    Ans=A*B;
    Ans.Print();
    return 0;
}

高精除低精

被除数\(a[\ ]\) ,除数\(B\),答案 \(ans[]\)

lst now=0;
for(int i=1;i<=len;++i)
{
    now=now*10+a[i];
    ans[++cnt]=now/B;
    now=now%B;
}bool flag=0;
for(int i=1;i<=cnt;++i)
{
    if(ans[i])flag=1;
    if(flag)printf("%d",ans[i]);
}puts("");

高精除高精

不停地做高精减就可以了
这个代码是的\(Quai\) ,别介意

int compare(int aa[],int bb[])
{
    if(aa[0]>bb[0])return 1;
    if(aa[0]<bb[0])return -1;
    for(int i=aa[0];i>0;i--)
    {
        if(aa[i]>bb[i])return 1;
        if(aa[i]<bb[i])return -1;
    }
    return 0;
}
void numcpy(int aa[],int bb[],int l)
{
    for(int i=1;i<=aa[0];i++)bb[i+l-1]=aa[i];
    bb[0]=aa[0]+l-1;
}
int main()
{
    cin>>a1>>b1;a[0]=a1.size();
    b[0]=b1.size(),c[0]=a[0]-b[0]+1;
    for(int i=1;i<=a[0];i++)a[i]=a1[a[0]-i]-‘0‘;
    for(int i=1;i<=b[0];i++)b[i]=b1[b[0]-i]-‘0‘;
    for(int i=c[0];i>0;i--)
    {
        memset(t,0,sizeof(t));
        numcpy(b,t,i);
        while(compare(a,t)>=0)
        {
            c[i]++;
            if(!compare(a,t)){a[0]=0;continue;}
            for(int i=1;i<=a[0];i++)
            {
                if(a[i]<t[i])
                    a[i+1]--,a[i]+=10;
                a[i]-=t[i];
            }
            while(a[0]>0&&!a[a[0]])a[0]--;
        }
    }
    while(c[0]>0&&!c[c[0]])c[0]--;
    if(!c[0])puts("0");
    else for(int i=c[0];i>0;i--)cout<<c[i];
    return 0;
}

高精取模低精

你把读入优化的板子改一下,一边读一边就行了。

int Read(lst n)
{
    lst x=0;char ch=getchar();
    while(!(ch>=‘0‘&&ch<=‘9‘))ch=getchar();//还不要判负数。。。
    while( (ch>=‘0‘&&ch<=‘9‘))x=(x*10+ch-‘0‘)%n,ch=getchar();
    return x?x:n;
}
int main()
{
    scanf("%lld",&n);
    cout<<Read(n)<<endl;
}

尾言

其实这些都可以放进一个程序operator
我就懒得再弄了
高精还是很简单的,就是写得烦
如今很多题目都采用取模的方法避免高精,所以掌握就行了

高精度模板汇总

原文:https://www.cnblogs.com/RioTian/p/13658755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!