昨天做一道dp的題(矩陣取數遊戲),本來是很簡單的,但是要用高精度,又不想用__int128水過去(誰讓noip不讓),於是自己打了乙個小時,最後成功掛了。。。
於是本蒟蒻痛定思痛,感覺高精度還是過載運算子好用啊,就花了幾個小時打了乙個自以為比較好記好用高精度模板:
注意暫不支援負數,如果發現有bug歡迎指出。
/*view code採用過載運算子,壓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()
這裡是壓的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...