高精度 重载运算符模板

  • 适用范围 非负数就可以
  • 注意n多n多的细节就可以啦
  • #include <stdio.h>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #include <stack>
    
    using namespace std;
    typedef long long ll;
    const int N=4;
    const ll base=1e4;
    
    struct HP
    {
        private:
        int len;ll a[200];//longlong一共占了8位字节,比int翻了一倍,所以数据量不需要太大
        inline void clear(){
            while(!a[len]&&len>1) len--;
        }
        public://public下面是冒号
        void print()//print是内部函数,所以不需要引用
        {
            printf("%lld",a[len]);
            for(int i=len-1;i>0;i--)//len已经输出,所以是len-1
                for(int j=base/10;j>0;j/=10) printf("%lld",a[i]/j%10);//j负责压缩部分,%10用来取个位的部分
                puts("");
        }
        HP &operator = (ll x)//赋值需要写引用 HP& operator
        {
            stack<char> q;string s;
            if(!x) return *this ='0';//直接返回'0' 相当于将int转化成string类型再统一使用string的=来进行处理
            while(x){q.push(x%10+'0');x/=10;}//注意转化成string类数字+‘0’
            while(q.size())
            {
                s+=q.top();
                q.pop();
            }
            return *this=s;
        }
        HP &operator = (const string &s)
        {
            HP res;
            memset(a,0ll,sizeof(a));//需要清空 
            int l=s.length();//len提前赋值
            for(int i=0;i<=l;i++)
            {
                int j=(l-i+(N-1))/N;//记忆:0开始的话刚好会落在数组的第一位 (1-0+3/4==1)
                a[j]=(a[j]<<1)+(a[j]<<3)+(s[i]^48);//快读
            }
            len=(l+(N-1))/N;//同样的记忆法则(就不需要-了)
            return *this;
        } 
        HP operator + (const HP &x)
        const {
            HP res;res.len=max(len,x.len);ll k=0;//加乘除都需要用res来存储//len也要额外处理一下
            for(int i=1;i<=res.len;i++)
            {
                res.a[i]=a[i]+x.a[i]+k;
                k=res.a[i]/base;
                res.a[i]%=base;
            }
            if(k>0) res.a[len+1]=k;//k要额外处理一下
            return res;
        }
        HP  operator -(const HP &x)
        const {
            HP res =*this;//直接拷贝回来(只有减)
            for(int i=1;i<=len;i++)//从小到大减,这里被减数的len一定更大
            {
                res.a[i]-=x.a[i];
                if(res.a[i]<0) res.a[i+1]--,res.a[i]+=base;
            } 
            res.clear();
            return res;
        }
        HP  operator *(const ll &x)//乘单精度
        const {
            HP res;
            for(int i=1;i<=len;i++) res.a[i]*=x;
            for(int i=1;i<=len;i++) res.a[i+1]+=res.a[i]/base,res.a[i]%=base;
            int &end=res.len;//用end来进行存储一下
            while(res.a[end+1]>0) {end++;res.a[end+1]=res.a[end]/base,res.a[end]%=base;}
            return res;
        } 
        HP operator * (const HP &x)
        const {
            HP res;res.len=len+x.len;
            for(int i=1;i<=len;i++)
                 for(int j=1;j<=x.len;j++)
                 {
                     res.a[i+j-1]=a[i]*x.a[j];
                     res.a[i+j]=res.a[i+j-1]/base;
                     res.a[i+j-1]%=base;
                 }
            res.clear();
            return res;
        }
        HP  operator / (const ll &x)
        const {
            HP res;res.len=len;ll k=0ll;
            for(int i=len;i>=1;i--)
            {
                k=k*base+a[i];
                res.a[i]=k/x;
                k%=x;
            }
            res.clear();
            return res;
        }
        ll  operator %(const ll &x)
        const {
            ll k=0ll;
            for(int i=len;i>=1;i--)
            {
                k=k*base+a[i];
                k%=x;//这里只关心k就好
            }
            return k;
        }
        bool  operator >(const HP &x)
        const {
            if(len==x.len)
            {
                int i;
                for(i=len;i>=1&&a[i]==x.a[i];i--);//消除i的影响,所以说后面的分号一定要记住
                if(i>=1) return a[i]>x.a[i];
                else return false;
            }
            return len>x.len;
        }
        bool  operator <(const HP &x)// 返回值是bool类型
        const {
            if(len==x.len)
            {
                int i;
                for(i=len;i>=1&&a[i]==x.a[i];i--);
                if(i>=1) return a[i]<x.a[i];//>=¶¼ËµÃ÷¿ÉÒÔ¼Æ½Ï 
                else return false;
            }
            return len<x.len;
        }
    };//这里需要有一个分号
    HP max(const HP&a,const HP &b)
    {
        if(a>b) return a;
        return b;
    }
    string sa,sb;
    HP a,b,ans;
    int main()
    {
        cin>>sa>>sb;
        a=sa,b=sb;
        a=3;
        ans=a+b; 
        //printf("%d");
        ans.print();
        return 0;
    }

     

posted @ 2020-10-29 11:04  ILH  阅读(138)  评论(0)    收藏  举报