高精度模板 過載運算子 壓位

2022-03-16 16:46:47 字數 2274 閱讀 1693

昨天做一道dp的題(矩陣取數遊戲),本來是很簡單的,但是要用高精度,又不想用__int128水過去(誰讓noip不讓),於是自己打了乙個小時,最後成功掛了。。。

於是本蒟蒻痛定思痛,感覺高精度還是過載運算子好用啊,就花了幾個小時打了乙個自以為比較好記好用高精度模板:

注意暫不支援負數,如果發現有bug歡迎指出。

/*

採用過載運算子,壓b位

支援高精數賦值與輸出、高精加(減)高精、高精乘低(高)精、高精除(模)低精、高精的比較

注意:暫不支援負數!!!

*/#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=128,b=4

;const ll base=1e4;//

壓b位,base為1eb

struct

hp//

清除前導0

public

: hp()

//注意因為是壓b位的,所以輸出要特殊處理

void print()

/*以下是過載運算子

*/hp& operator =(ll x)

while(!st.empty()) s+=st.top(),st.pop();//

其實就是把int轉換為string再呼叫init_s()

return *this=s;

}hp& operator =(const

string &s)

len=(l+(b-1))/b;

return *this

; }

hp operator +(const hp &x)const

if(k>0) res.a[++res.len]=k;

return

res;

}hp

operator -(const hp &x)const

res.clear();

return

res;

}hp

operator *(const ll &x)const

return

res;

}hp

operator *(const hp &x)const

res.clear();

return

res;

}hp

operator /(const ll &x)const

res.clear();

return

res;

}ll

operator %(const ll &x)const

return k;//

其實跟高精除低精差不多的,只不過不用存res,返回的是k

}

bool

operator

else

return len

}bool

operator >(const hp &x)const

else

return len>x.len;

}//其實一般大於和小於號過載乙個就夠用了

};hp max(

const hp &a,const hp &b)

hp min(

const hp &a,const hp &b)

hp a,b,ans;

string

sa,sb;

intmain()

view code

這裡是壓的4位,可以改b和base變成壓b位。

想粘板子就粘吧,打得醜我承認。

update on 11.3

在打模擬題時我自己就發現了幾個bug:

(1)過載賦值運算子時,需要特判x=0的情況,不然無法賦值為0

(2)不能用unsigned long long,因為高精減時一旦減出負數unsigned long long就會溢位,然後就出鍋了(我太菜了這都沒發現)。。。因此最好用long long

(3)高精除與高精模,當除數很大時(接近long long的極大值)很容易溢位,這時運算過程中可能出現的最大位數為(壓的位數+除數的位數),因此這個時候就應酌情減少壓的位數了

以上bug直接導致我那題100->75。。。

2018-10-20

高精度過載運算子

高精度過載運算子模板 include include includeusing namespace std const int maxn 200 struct bign bign int num 定義為const引數,作用是 不能對const引數的值做修改 bign const char num 以...

壓位高精度模板

原先是整型陣列每個元素存1個數字,壓位高精是每位存8個數字,這樣可以加速8唄,空間也減小了。可謂是對整形陣列的充分利用。include include include include include include include include include include include in...

壓位高精度模板

不走程式,直接上板子。第乙個板子壓四位,支援帶符號的加減乘。第二個板子壓九位,支援不帶符號的四則運算和取模。都封裝了。include include include using namespace std struct intx bool operator const intx b const bo...