专栏文章

free 高精乘、加、减

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minyrz4t
此快照首次捕获于
2025/12/02 10:33
3 个月前
此快照最后确认于
2025/12/02 10:33
3 个月前
查看原文
CPP
class Bigint{

public: 
    int a[105];
    Bigint()
    {
        memset(a,0,sizeof(a));
        a[0]=1;
    }
    friend ostream & operator << (ostream &o,const Bigint &b);
    friend istream & operator >> (istream &in,Bigint &b);
    Bigint operator + (Bigint r)
    {
        Bigint c;
        c.a[0]=max(a[0],r.a[0]);
        for(int i=1;i<=c.a[0];i++)
        {
            c.a[i]+=a[i]+r.a[i];
            c.a[i+1]+=c.a[i]/10;
            c.a[i]%=10;
        }
        if(c.a[c.a[0]+1])
            c.a[0]++;
        while(c.a[c.a[0]]==0&&c.a[0]>=2)
            c.a[0]--;
        return c;
    }
    Bigint operator - (Bigint r)
    {
        Bigint c;
        c.a[0]=max(a[0],r.a[0]);
        for(int i=1;i<=c.a[0];i++)
        {
            c.a[i]+=a[i]-r.a[i];
            if(c.a[i]<0)
            {
                c.a[i]+=10;
                c.a[i+1]--;
            }
        }
        while(c.a[c.a[0]]==0&&c.a[0]>=2)
            c.a[0]--;
        return c;
    }
    Bigint operator * (Bigint r)
    {
        Bigint c;
        c.a[0]=a[0]+r.a[0];
        for(int i=1;i<=a[0];i++)
            for(int j=1;j<=r.a[0];j++)
            {
                c.a[i+j-1]+=a[i]*r.a[j];
            }
        for(int i=1;i<=c.a[0];i++)
        {
		    c.a[i+1]+=c.a[i]/10;
		    c.a[i]%=10;
        }
        while(c.a[c.a[0]]==0&&c.a[0]>=2)
            c.a[0]--;
        return c;
    }
    bool operator < (Bigint r)
    {
        if(a[0]!=r.a[0])
            return a[0]<r.a[0];
        for(int i=a[0];i>=1;i--)
            if(a[i]!=r.a[i])
                return a[i]<r.a[i];
        return false;
    }
    bool operator > (Bigint r)
    {
        if(a[0]!=r.a[0])
            return a[0]>r.a[0];
        for(int i=a[0];i>=1;i--)
            if(a[i]!=r.a[i])
                return a[i]>r.a[i];
        return false;
    }
    bool operator <= (Bigint r)
    {
        if(a[0]!=r.a[0])
            return a[0]<=r.a[0];
        for(int i=a[0];i>=1;i--)
            if(a[i]!=r.a[i])
                return a[i]<=r.a[i];
        return true;
    }
    bool operator >= (Bigint r)
    {
        if(a[0]!=r.a[0])
            return a[0]>=r.a[0];
        for(int i=a[0];i>=1;i--)
            if(a[i]!=r.a[i])
                return a[i]>=r.a[i];
        return true;
    }
    Bigint operator / (Bigint r)
    {
        Bigint c;
        c.a[0]=a[0]-r.a[0]+1;
        for(int i=c.a[0];i>=1;i--)
        {
            int x=0;
            while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])
                x++;
            c.a[i]=x;
            for(int j=r.a[0];j>=1;j--)
                a[i+x-1+j]-=r.a[j]*x;
        }
        while(c.a[c.a[0]]==0&&c.a[0]>=2)
            c.a[0]--;
        return c;
    }
    Bigint operator % (Bigint r)
    {
        Bigint c;
        c.a[0]=a[0]-r.a[0]+1;
        for(int i=c.a[0];i>=1;i--)
        {
            int x=0;
            while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])
                x++;
            c.a[i]=x;
            for(int j=r.a[0];j>=1;j--)
                a[i+x-1+j]-=r.a[j]*x;
        }
        while(c.a[c.a[0]]==0&&c.a[0]>=2)
            c.a[0]--;
        return c;
    }
    
};
istream & operator >> (istream &in,Bigint &b)
{
    string s;
    in>>s;
    b.a[0]=s.size();
    for(size_t i=0;i<s.size();i++)
        b.a[i+1]=s[s.size()-1-i]-'0';
    return in;
}
ostream & operator << (ostream &o,const Bigint &b)
{
    for(int i=b.a[0];i>=1;i--)
        o<<b.a[i];
    return o;
}

Bigint int_to_bigint(int num)
{
    Bigint res;
    if(num==0)
    {
        res.a[0]=1;
        res.a[1]=0;
        return res;
    }
    if(num<0)
    {
        num=-num;
    }
    int len=0;
    while(num>0)
    {
        res.a[++len]=num%10;
        num/=10;
    }
    res.a[0]=len;
    return res;
}

压行后的:
CPP
class Bigint{public: int a[105]; Bigint(){memset(a,0,sizeof(a));a[0]=1;} friend ostream & operator << (ostream &o,const Bigint &b); friend istream & operator >> (istream &in,Bigint &b); Bigint operator + (Bigint r){Bigint c;c.a[0]=max(a[0],r.a[0]);for(int i=1;i<=c.a[0];i++){c.a[i]+=a[i]+r.a[i];c.a[i+1]+=c.a[i]/10;c.a[i]%=10;}if(c.a[c.a[0]+1])c.a[0]++;while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator - (Bigint r){Bigint c;c.a[0]=max(a[0],r.a[0]);for(int i=1;i<=c.a[0];i++){c.a[i]+=a[i]-r.a[i];if(c.a[i]<0){c.a[i]+=10;c.a[i+1]--;}}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator * (Bigint r){Bigint c;c.a[0]=a[0]+r.a[0];for(int i=1;i<=a[0];i++)for(int j=1;j<=r.a[0];j++){c.a[i+j-1]+=a[i]*r.a[j];}for(int i=1;i<=c.a[0];i++){c.a[i+1]+=c.a[i]/10;c.a[i]%=10;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} bool operator < (Bigint r){if(a[0]!=r.a[0])return a[0]<r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]<r.a[i];return false;} bool operator > (Bigint r){if(a[0]!=r.a[0])return a[0]>r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]>r.a[i];return false;} bool operator <= (Bigint r){if(a[0]!=r.a[0])return a[0]<=r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]<=r.a[i];return true;} bool operator >= (Bigint r){if(a[0]!=r.a[0])return a[0]>=r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]>=r.a[i];return true;} Bigint operator / (Bigint r){Bigint c;c.a[0]=a[0]-r.a[0]+1;for(int i=c.a[0];i>=1;i--){int x=0;while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])x++;c.a[i]=x;for(int j=r.a[0];j>=1;j--)a[i+x-1+j]-=r.a[j]*x;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator % (Bigint r){Bigint c;c.a[0]=a[0]-r.a[0]+1;for(int i=c.a[0];i>=1;i--){int x=0;while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])x++;c.a[i]=x;for(int j=r.a[0];j>=1;j--)a[i+x-1+j]-=r.a[j]*x;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;}}; istream & operator >> (istream &in,Bigint &b){string s;in>>s;b.a[0]=s.size();for(size_t i=0;i<s.size();i++)b.a[i+1]=s[s.size()-1-i]-'0';return in;} ostream & operator << (ostream &o,const Bigint &b){for(int i=b.a[0];i>=1;i--)o<<b.a[i];return o;} Bigint int_to_bigint(int num){Bigint res;if(num==0){res.a[0]=1;res.a[1]=0;return res;}if(num<0){num=-num;}int len=0;while(num>0){res.a[++len]=num%10;num/=10;}res.a[0]=len;return res;}

评论

0 条评论,欢迎与作者交流。

正在加载评论...