1. 程式人生 > 實用技巧 >高精度 過載運算子模板

高精度 過載運算子模板

  • 適用範圍 非負數就可以
  • 注意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; }