『模板 高精度計算』
阿新 • • 發佈:2019-03-13
更新 als mes str 模板 -- oid ret char
<更新提示>
<第一次更新>
<正文>
高精度計算
在計數類題目或者有些最優解題目中,需要輸出的答案很可能會爆\(longlong\),這時候就需要用到高精度了。高精度計算較為簡單,不再講解,以下給出輔助常用的高精度計算模板:支持正整數的加,減,乘運算,讀入輸出,比較,以\(1e8\)壓位計算,結構體封裝。
\(Code:\)
#include<bits/stdc++.h> using namespace std; const int base=1e8,Maxlen=1e4; struct bign { int d[Maxlen],len; inline void clear(void) { len=0; memset(d,0,sizeof d); } inline void print(void) { printf("%d",d[len]); for(int i=len-1;i>=1;i--) printf("%08d",d[i]); } inline bign read(void) { clear(); char s[5000]; scanf("%s",s); int last=strlen(s)-1,temp; while(last>=7) { temp=0; for(int i=last-8+1;i<=last;i++) temp=temp*10+s[i]-'0'; d[++len]=temp; last-=8; } temp=0; for(int i=0;i<=last;i++) temp=temp*10+s[i]-'0'; d[++len]=temp; while(!d[len]&&len>1)len--; return *this; } bign operator = (int a) { clear(); do { d[++len]=a%base; a/=base; } while(a); return *this; } bign operator * (bign a) { bign res; res.clear(); long long temp; for(int i=1;i<=len;i++) { temp=0; for(int j=1;j<=a.len;j++) { temp+=1LL*d[i]*a.d[j]+res.d[i+j-1]; res.d[i+j-1]=temp%base; temp/=base; } if(temp) res.d[i+a.len]=temp; } res.len=len+a.len; while(!res.d[res.len]&&res.len>1)res.len--; return res; } bign operator + (bign a) { for(int i=1;i<=max(a.len,len);i++) { d[i]+=a.d[i]; d[i+1]+=d[i]/base; d[i]%=base; } len=max(a.len,len)+5; while(!d[len]&&len>1)len--; return *this; } bign operator - (bign a) { for(int i=1;i<=len;i++) { d[i]-=a.d[i]; if(d[i]<0)d[i+1]--,d[i]+=base; } while(!d[len]&&len>1)len--; return *this; } bool operator < (const bign a)const { if(a.len^len) return len<a.len; for(int i=len;i>=1;i--) if(d[i]^a.d[i]) return d[i]<a.d[i]; return false; } };
<後記>
『模板 高精度計算』