高精度模板
Alarm5854
·
·
个人记录
定义高精度:
struct ll{
char s[10001];//字符串定义
int a[10001],flag;//数字以及符号
void clear()//初始化
{
memset(s,0,10001);
memset(a,0,40004);
*a=1,flag=1;
}
void in()//输入
{
scanf("%s",s);
if(isdigit(*s))
{
flag=1,a[0]=strlen(s);
for(int i=0;i<*a;++i)
a[*a-i]=s[i]-48;
}
else//处理负数
{
flag=(*s=='-'?-1:1),a[0]=strlen(s)-1;
for(int i=1;i<=*a;++i)
a[*a-i+1]=s[i]-48;
}
}
void out()//输出
{
if(!flag)
{
puts("INF"),flag=1;//处理除法或者模运算除以0
return;
}
if(!~flag) printf("-");//是负数输出符号
for(int i=*a;i;--i)
printf("%d",a[i]);
puts("");
}
void sin(long long x)//低精转高精
{
clear(),a[0]=0;
if(x<0) flag=-1,x=-x;
else flag=1;
while(x)
a[++*a]=x%10,x/=10;
}
void sout(long long &x)//高精转低精
{
for(int i=*a;i>0;--i)
x=x*10+a[i];
if(!~flag) x=-x;
}
int& operator [](const int &n)//运用数组运算符,方便访问数组元素
{
if(!~n) return flag;
return a[n];
}
};
一波定义高精度运算:
bool operator <(ll a,ll b);
bool operator >(ll a,ll b);
bool operator <=(ll a,ll b);
bool operator >=(ll a,ll b);
bool operator !=(ll a,ll b);
bool operator ==(ll a,ll b);
ll operator +(ll a,ll b);
ll operator -(ll a,ll b);
ll operator *(ll a,ll b);
ll operator /(ll a,ll b);
ll operator %(ll a,ll b);
ll& operator +=(ll &a,ll &b);
ll& operator -=(ll &a,ll &b);
ll& operator *=(ll &a,ll &b);
ll& operator /=(ll &a,ll &b);
ll& operator %=(ll &a,ll &b);
bool operator <(long long a,ll b);
bool operator >(long long a,ll b);
bool operator <=(long long a,ll b);
bool operator >=(long long a,ll b);
bool operator !=(long long a,ll b);
bool operator ==(long long a,ll b);
ll operator +(long long a,ll b);
ll operator -(long long a,ll b);
ll operator *(long long a,ll b);
ll operator /(long long a,ll b);
ll operator %(long long a,ll b);
bool operator <(ll a,long long b);
bool operator >(ll a,long long b);
bool operator <=(ll a,long long b);
bool operator >=(ll a,long long b);
bool operator !=(ll a,long long b);
bool operator ==(ll a,long long b);
ll operator +(ll a,long long b);
ll operator -(ll a,long long b);
ll operator *(ll a,long long b);
ll operator /(ll a,long long b);
ll operator %(ll a,long long b);
ll& operator +=(ll &a,long long b);
ll& operator -=(ll &a,long long b);
ll& operator *=(ll &a,long long b);
ll& operator /=(ll &a,long long b);
ll& operator %=(ll &a,long long b);
高精度运算:
bool operator <(ll a,ll b)
{
if(!~a[-1]&&~b[-1]) return 1;
if(~a[-1]&&!~b[-1]) return 0;
if(!~a[-1]&&!~b[-1])
{
a[-1]=b[-1]=1;
return a>b;
}
if(a[0]<b[0]) return 1;
if(a[0]>b[0]) return 0;
for(int i=a[0];i>0;--i)
{
if(a[i]<b[i]) return 1;
if(a[i]>b[i]) return 0;
}
return 0;
}
bool operator >(ll a,ll b)
{
if(!~a[-1]&&~b[-1]) return 0;
if(~a[-1]&&!~b[-1]) return 1;
if(!~a[-1]&&!~b[-1])
{
a[-1]=b[-1]=1;
return a<b;
}
if(a[0]<b[0]) return 0;
if(a[0]>b[0]) return 1;
for(int i=a[0];i>0;--i)
{
if(a[i]<b[i]) return 0;
if(a[i]>b[i]) return 1;
}
return 0;
}
bool operator <=(ll a,ll b)
{
return !(a>b);
}
bool operator >=(ll a,ll b)
{
return !(a<b);
}
bool operator !=(ll a,ll b)
{
return a>b||a<b;
}
bool operator ==(ll a,ll b)
{
return !(a!=b);
}
ll operator +(ll a,ll b)
{
ll c;
c.clear();
if(!~a[-1]&&!~b[-1])
{
a[-1]=b[-1]=1;
c=a+b,c[-1]=-1;
return c;
}
if(!~a[-1])
{
a[-1]=1;
c=b-a;
return c;
}
if(!~b[-1])
{
b[-1]=1;
c=a-b;
return c;
}
c[0]=max(a[0],b[0]);
for(int i=1;i<=c[0];++i)
c[i]=a[i]+b[i];
for(int i=1;i<=c[0];++i)
c[i+1]+=c[i]/10,c[i]%=10;
if(c[c[0]+1]) ++c[0];
return c;
}
ll& operator +=(ll &a,ll &b)
{
a=a+b;
return a;
}
ll operator -(ll a,ll b)
{
ll c;
c.clear();
if(!~a[-1])
{
a[-1]=1;
c=a+b,c[-1]=-c[-1];
return c;
}
if(!~b[-1])
{
b[-1]=1;
c=a+b;
return c;
}
if(a<b)
{
c=b-a,c[-1]=-1;
return c;
}
c=a;
for(int i=1;i<=c[0];++i)
{
c[i]-=b[i];
if(c[i]<0)
--c[i+1],c[i]+=10;
}
while(!c[c[0]]&&c[0]>1) --c[0];
}
ll& operator -=(ll &a,ll &b)
{
a=a-b;
return a;
}
ll operator *(ll a,ll b)
{
ll c;
int x;
c.clear();
if(a[-1]!=b[-1])
{
a[-1]=b[-1]=1;
c=a*b,c[-1]=-1;
return c;
}
c[0]=a[0]+b[0],a[-1]=b[-1]=1;
for(int i=1;i<=a[0];++i)
{
x=0;
for(int j=1;j<=b[0];++j)
{
c[i+j-1]+=a[i]*b[j]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+b[0]]=x;
}
while(!c[c[0]]&&c[0]>1) --c[0];
return c;
}
ll& operator *=(ll &a,ll &b)
{
a=a*b;
return a;
}
ll operator /(ll a,ll b)
{
ll c,t;
c.clear();
if(b==0)
{
c[-1]=0;
return c;
}
if(a[-1]!=b[-1])
{
a[-1]=b[-1]=1;
c=a/b,c[-1]=-1;
return c;
}
c[0]=a[0]-b[0]+1,a[-1]=b[-1]=1;
if(c[0]<1)
{
c[0]=1;
return c;
}
for(int i=c[0];i>0;--i)
{
t.clear();
for(int j=1;j<=b[0];++j)
t[i+j-1]=b[j];
t[0]=i+b[0]-1;
while(a>=t) ++c[i],a-=t;
}
while(!c[c[0]]&&c[0]>1) --c[0];
return c;
}
ll& operator /=(ll &a,ll &b)
{
a=a/b;
return a;
}
ll operator %(ll a,ll b)
{
ll c,t;
int d=1;
c.clear();
if(!~a[-1]) d=-1;
if(b==0)
{
a[-1]=0;
return a;
}
if(a[-1]!=b[-1])
{
a[-1]=b[-1]=1;
c=a%b,c[-1]=d;
return c;
}
c[0]=a[0]-b[0]+1,a[-1]=b[-1]=1;
if(c[0]<1)
{
c[0]=1;
return a;
}
for(int i=c[0];i>0;--i)
{
t.clear();
for(int j=1;j<=b[0];++j)
t[i+j-1]=b[j];
t[0]=i+b[0]-1;
while(a>=t) ++c[i],a-=t;
}
while(!c[c[0]]&&c[0]>1) --c[0];
a[-1]=d;
return a;
}
ll& operator %=(ll &a,ll &b)
{
a=a%b;
return a;
}
bool operator <(long long a,ll b)
{
ll x;
x.sin(a);
return x<b;
}
bool operator >(long long a,ll b)
{
ll x;
x.sin(a);
return x>b;
}
bool operator <=(long long a,ll b)
{
ll x;
x.sin(a);
return x<=b;
}
bool operator >=(long long a,ll b)
{
ll x;
x.sin(a);
return x>=b;
}
bool operator !=(long long a,ll b)
{
ll x;
x.sin(a);
return x!=b;
}
bool operator ==(long long a,ll b)
{
ll x;
x.sin(a);
return x==b;
}
ll operator +(long long a,ll b)
{
ll x;
x.sin(a);
return x+b;
}
ll operator -(long long a,ll b)
{
ll x;
x.sin(a);
return x-b;
}
ll operator *(long long a,ll b)
{
ll x;
x.sin(a);
return x*b;
}
ll operator /(long long a,ll b)
{
ll x;
x.sin(a);
return x/b;
}
ll operator %(long long a,ll b)
{
ll x;
x.sin(a);
return x%b;
}
bool operator <(ll a,long long b)
{
ll x;
x.sin(b);
return a<x;
}
bool operator >(ll a,long long b)
{
ll x;
x.sin(b);
return a>x;
}
bool operator <=(ll a,long long b)
{
ll x;
x.sin(b);
return a<=x;
}
bool operator >=(ll a,long long b)
{
ll x;
x.sin(b);
return a>=x;
}
bool operator !=(ll a,long long b)
{
ll x;
x.sin(b);
return a!=x;
}
bool operator ==(ll a,long long b)
{
ll x;
x.sin(b);
return a==x;
}
ll operator +(ll a,long long b)
{
ll x;
x.sin(b);
return a+x;
}
ll operator -(ll a,long long b)
{
ll x;
x.sin(b);
return a-x;
}
ll operator *(ll a,long long b)
{
ll x;
x.sin(b);
return a*x;
}
ll operator /(ll a,long long b)
{
ll x;
x.sin(b);
return a/x;
}
ll operator %(ll a,long long b)
{
ll x;
x.sin(b);
return a%x;
}
ll& operator +=(ll &a,long long b)
{
a=a+b;
return a;
}
ll& operator -=(ll &a,long long b)
{
a=a-b;
return a;
}
ll& operator *=(ll &a,long long b)
{
a=a*b;
return a;
}
ll& operator /=(ll &a,long long b)
{
a=a/b;
return a;
}
ll& operator %=(ll &a,long long b)
{
a=a%b;
return a;
}
ll& operator ++(ll &a)
{
a+=1;
return a;
}
ll& operator --(ll &a)
{
a-=1;
return a;
}
istream& operator >>(istream& is,ll &x)
{
x.in();
return is;
}
ostream& operator <<(ostream& os,ll &x)
{
x.out();
return os;
}