[note]高精度模板
阿新 • • 發佈:2018-11-08
turn lan wap void ret 模板 continue for oid
高精度模板
先定義一個struct
struct gj{
int l,s[N];
bool fh;
void Print(){
if(fh)putchar('-');
for(int i=l;i>=1;i--)printf("%d",s[i]);
puts("");
}
}blank;
高精+高精
加之前判斷一下符號
一負一正轉成減法
gj operator +(gj x,gj y){ gj z=blank;z.l=max(x.l,y.l); for(int i=1;i<=z.l;i++){ z.s[i]+=x.s[i]+y.s[i]; if(z.s[i]>9)z.s[i+1]++,z.s[i]-=10; } if(z.s[z.l+1])z.l++; return z; }
高精-高精
gj operator -(gj x,gj y){ gj z=blank;z.l=max(x.l,y.l); for(int i=z.l;i>=1;i--){ if(x.s[i]==y.s[i])continue; if(x.s[i]<y.s[i])swap(x,y),z.fh=1; break; } for(int i=1;i<=z.l;i++){ z.s[i]+=x.s[i]-y.s[i]; if(z.s[i]<0)z.s[i]+=10,z.s[i+1]--; } while(!z.s[z.l]&&z.l>1)z.l--; return z; }
高精*高精
gj operator *(gj x,gj y){ gj z=blank;z.l=x.l+y.l; for(int i=1;i<=x.l;i++){ int jw=0; for(int j=1;j<=y.l;j++){ z.s[i+j-1]+=x.s[i]*y.s[j]+jw; jw=z.s[i+j-1]/10; z.s[i+j-1]%=10; } z.s[i+b.l]=jw; } while(z.l>1&&!z.s[z.l])z.l--; return z; }
[note]高精度模板