一个简单的高精模板

现有高精加高精,高精减高精,高精乘低精,高精除低精功能。

暂无高精乘高精,高精除高精,高精加减低精(太懒了),没有压位处理。

写的很蠢,很多地方没有协调好,有些变量和函数都是临时加上去的,可读性较差,要学习并改正。

(大概率会有bug,但是暂时没有发现)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct Bignum
{
    vector<int>num;
    int f;
    bool checkzero()const
    {
        for(int i=0;i<num.size();i++) if(num[i]) return false;
        return true;
    }
    Bignum Add(Bignum &A,Bignum &B)
    {
        Bignum b;b.f=A.f;
        for(int i=0,d=0;;i++)
        {
            int sum=d;
            if(i>=A.num.size()&&i>=B.num.size()&&!d) break;
            if(i<A.num.size()) sum+=A.num[i];
            if(i<B.num.size()) sum+=B.num[i];
            if(sum>=10){sum=sum%10;d=1;}
            else d=0;
            b.num.push_back(sum);
        }
        return b;
    }
    Bignum Minus(Bignum &A,Bignum &B)
    {
        Bignum b;
        if(A<B){swap(A,B);b.f=-A.f;}
        else b.f=A.f;
        for(int i=0,d=0;;i++)
        {
            int sum=d;
            if(i>=A.num.size()&&i>=B.num.size()&&!d) break;
            if(i<A.num.size()) sum+=A.num[i];
            if(i<B.num.size()) sum-=B.num[i];
            if(sum<0){sum=(sum+10)%10;d=-1;}
            else d=0;
            b.num.push_back(sum);
        }
        int k=b.num.size();
        while(!b.num[--k]&&k);
        b.num=vector<int>(b.num.begin(),b.num.begin()+k);
        if(b.checkzero())b.f=1;
        return b;
    }
    Bignum operator-(Bignum &B)
    {
        if(f!=B.f){B.f=-f;return Add(*this,B);}
        return Minus(*this,B);
    }
    Bignum operator+(Bignum &B)
    {
        if(f!=B.f){B.f=-1;return Minus(*this,B);}
        return Add(*this,B);
    }
    Bignum operator/(long long B)
    {
        Bignum b;int bf=1;
        if(B<0) B=-B,bf=-1;
        cout<<f<<" "<<bf<<endl;
        bf=f*bf;
        long long shu=0;
        string ans="";
        for(int i=num.size()-1;i>=0;i--)
        {
            shu=shu*10+num[i];
            if(shu>=B) 
            {
                ans+=char(shu/B+'0');
                shu=shu%B;
            }
            else ans+='0';
        }
        b=ans;b.f=bf;
        if(b.checkzero()) b.f=1;
        return b;
    }
    Bignum operator*(long long B)
    {
        Bignum b;int bf=1;
        if(B<0) B=-B,bf=-1;
        bf=f*bf;
        long long shu[num.size()];
        for(int i=0;i<num.size();i++)
            shu[i]=num[i]*B;
        long long d=0;string ans="";
        for(int i=0;;i++)
        {
            if(i>=num.size()&&!d) break;
            if(i<num.size()) d+=shu[i];
            b.num.push_back(d%10);
            d/=10;
        }
        b.f=bf;
        if(b.checkzero()) b.f=1;
        return b;
    }
    Bignum operator=(long long N)
    {
        num.clear();
        if(N<0) f=-1,N=-N;
        else f=1;
        while(N)
        {
            num.push_back(N%10);
            N/=10;
        }
        return *this;
    }
    Bignum operator=(const string &S)
    {
        num.clear();
        if(S[0]=='-') f=-1;
        else f=1;
        int x,len=(S.length()-1);
        int st=0;
        while(st<=len&&(S[st]=='0'||S[st]=='-'))st++;
        if(st==len+1) num.push_back(0);
        for(int i=len;i>=st;i--)
        {
            x=S[i]-'0';
            num.push_back(x);
        }
        return *this;
    }
    bool operator <(Bignum &B)
    {
        if(f!=B.f) return f<B.f;
        if(num.size()!=B.num.size()) return num.size()<B.num.size();
        for(int i=num.size()-1;i>=0;i--)
            if(num[i]!=B.num[i]) return num[i]<B.num[i];
        return false;
    }
};
ostream&operator<<(ostream &out,const Bignum &B)
{
    if(B.checkzero()) out<<"0";
    else
    {
        if(B.f==-1) out<<"-";
        int k=B.num.size();
        for(int i=k-1;i>=0;i--)
            out<<B.num[i];
    }
    return out;
}
istream& operator >>(istream &in, Bignum &x)
{
    string s;
    if(!(in>>s)) return in;
    x=s;
    return in;
}
int main()
{
//    ios::sync_with_stdio(false);
    
//    system("pause");
}

猜你喜欢

转载自www.cnblogs.com/tmzengbi/p/12031615.html