高精度模板 发表于 2019-10-05 | 阅读次数: 本文字数: 23k | 阅读时长 ≈ 21 分钟 直接上代码点击显/隐代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186#include<bits/stdc++.h>using namespace std;struct number{ int size,num[1005]; number() { memset(num,0,sizeof(num)); } inline void read() { char c[1005]; scanf("%s",c+1); size=strlen(c+1); for(int i=1;i<=size;i++) num[i]=c[size-i+1]-'0'; } inline void init(int a) { size=0; while(a) { size++; num[size]=a%10; a/=10; } } inline void write() { for(int i=size;i>=1;i--) printf("%d",num[i]); printf("\n"); } inline bool operator!=(const number &a) const { if(size!=a.size) return true; for(int i=size;i>=1;i--) if(num[i]!=a.num[i]) return true; return false; } inline bool operator==(const number &a) const { if(*this!=a) return false; return true; } inline bool operator<(const number &a) const { if(size!=a.size) return size<a.size; for(int i=size;i>=1;i--) if(num[i]!=a.num[i]) return num[i]<a.num[i]; return false; } inline bool operator<=(const number &a) const { if(*this<a||*this==a) return true; return false; } inline bool operator>(const number &a) const { if(*this<=a) return false; return true; } inline bool operator>=(const number &a) const { if(*this<a) return false; return true; } inline number operator+(const number &a) const { number ans; int t=0; ans.size=max(size,a.size); for(int i=1;i<=ans.size;i++) { ans.num[i]=num[i]+a.num[i]+t; t=ans.num[i]/10; ans.num[i]%=10; } if(t) { ans.size++; ans.num[ans.size]+=t; } while(ans.num[ans.size]>=10) { ans.num[ans.size+1]+=ans.num[ans.size]/10; ans.num[ans.size]%=10; ans.size++; } return ans; } inline number operator-(const number &a) const { number ans; int t=0; ans.size=max(size,a.size); for(int i=1;i<=ans.size;i++) { ans.num[i]=num[i]-a.num[i]+t; int x=(ans.num[i]+10)%10; t=(ans.num[i]-x)/10; ans.num[i]=x; } while(!ans.num[ans.size]&&ans.size>1) ans.size--; return ans; } inline number operator*(const number &a) const { number ans; ans.size=size+a.size; for(int i=1;i<=size;i++) for(int j=1;j<=a.size;j++) ans.num[i+j-1]+=num[i]*a.num[j]; for(int i=1;i<ans.size;i++) { ans.num[i+1]+=ans.num[i]/10; ans.num[i]%=10; } while(!ans.num[ans.size]&&ans.size>1) ans.size--; return ans; } inline number times(int b) { number ans; ans.size=size; for(int i=1;i<=ans.size;i++) ans.num[i]=num[i]*b; for(int i=1;i<ans.size;i++) { ans.num[i+1]+=ans.num[i]/10; ans.num[i]%=10; } while(ans.num[ans.size]>=10&&ans.size>1) { ans.num[ans.size+1]+=ans.num[ans.size]/10; ans.num[ans.size]%=10; ans.size++; } while(!ans.num[ans.size]&&ans.size>1) ans.size--; return ans; } inline number divition(int x) { if(!x) return *this; number ans; int t=0; ans.size=size; for(int i=ans.size;i>=1;i--) { t=t*10+num[i]; ans.num[i]=t/x; t%=x; } while(!ans.num[ans.size]&&ans.size>1) ans.size--; return ans; } inline number pow(int x) { number ans,res=*this; ans.size=1; ans.num[ans.size]=1; for(int i=x;i;i>>=1,res=res*res) if(i&1) ans=ans*res; return ans; } inline number sqrt(int q) { number l,r=*this,mid,x,t,one; one.size=1; one.num[1]=0; l=one; one.num[1]=1; while(l<=r) { x=l+r; x=x.divition(2); t=x.pow(q); if(t==*this) return x; if(t<*this) l=x+one; else r=x-one; } return r; }};int main(){}