下为高精度,自带+,-,*,/,%,>,<,>=,<=运算和3种输入和输出,但不支持负数
struct Num
{
int len,num[N];
void init()
{
len=0;
memset(num,0,sizeof(num));
}
void add(int u)
{
int i;
len++;
for(i=len; i>=2; i--)
{
num[i]=num[i-1];
}
num[1]=u;
}
void in_int(int u)
{
len=0;
for(;u;len++,num[len]=u%10,u/=10);
}
void in_string(string u)
{
int i;
Num res;
init();
len=u.size();
for(i=u.size()-1; i>=0; i--)
{
num[u.size()-i]=u[i]-48;
}
}
void in()
{
char ch;
int i;
string str="";
for(ch=getchar();ch<='0';ch=getchar());
for(;ch>='0';ch=getchar(),str=ch+str);
len=str.size();
for(i=0;i<len;i++,num[i+1]=str[i]-1);
}
void out()
{
int i;
for(i=len; i>=1; i--)
{
printf("%d",num[i]);
}
puts("");
}
bool operator < (const Num &u) const
{
if(len<u.len) return 1;
if(len>u.len) return 0;
int i;
for(i=len; i>=1; i--)
{
if(num[i]<u.num[i]) return 1;
if(num[i]>u.num[i]) return 0;
}
return 0;
}
bool operator > (const Num &u) const
{
if(len<u.len) return 0;
if(len>u.len) return 1;
int i;
for(i=len; i>=1; i--)
{
if(num[i]<u.num[i]) return 0;
if(num[i]>u.num[i]) return 1;
}
return 0;
}
bool operator == (const Num &u) const
{
if(len!=u.len) return 0;
int i;
for(i=len; i>=1; i--)
{
if(num[i]!=u.num[i]) return 0;
}
return 1;
}
bool operator >= (const Num & u) const
{
if(*this<u) return 0;
return 1;
}
bool operator <= (const Num & u) const
{
if(*this>u) return 0;
return 1;
}
Num operator + (const Num &u) const
{
Num res;
int i;
res.init();
res.len=max(u.len,len);
for(i=1; i<=res.len; i++)
{
res.num[i]+=u.num[i]+num[i];
res.num[i+1]+=res.num[i]/10;
res.num[i]%=10;
}
res.len+=res.num[res.len+1];
return res;
}
Num operator - (const Num &u) const
{
Num res;
int i;
res.init();
res.len=len;
for(i=1; i<=len; i++)
{
res.num[i]+=num[i]-u.num[i];
if(res.num[i]<0)
{
res.num[i]+=10;
res.num[i+1]--;
}
}
for(; !res.num[res.len]&&res.len>=2; res.len--);
return res;
}
Num operator * (const Num &u) const
{
Num res;
int i,j;
res.init();
for(i=1; i<=len; i++)
{
for(j=1; j<=u.len; j++)
{
res.num[i+j-1]+=num[i]*u.num[j];
}
}
for(i=1; i<=len+u.len; i++)
{
res.num[i+1]+=res.num[i]/10;
res.num[i]%=10;
}
res.len=len+u.len;
for(; !res.num[res.len]&&res.len>=2; res.len--);
return res;
}
Num operator / (const Num &u) const
{
Num res,last,tmp;
res.init();
last.init();
int i,j,k,now;
now=len;
for(;;)
{
for(; last<u&&now;)
{
last.add(num[now]);
res.add(0);
now--;
}
if(!now&&last<u) break;
for(i=2; i<=9; i++)
{
tmp.init();
tmp.len=1;
tmp.num[1]=i;
tmp=tmp*u;
if(tmp>last) break;
}
res.add(i-1);
last=last+u-tmp;
if(!now) break;
last.add(num[now]);
now--;
for(; !last.num[last.len]&&last.len>=2; last.len--);
}
for(; !res.num[res.len]&&res.len>=2; res.len--);
return res;
}
Num operator % (const Num &u) const
{
Num res,last,tmp;
res.init();
last.init();
int i,j,k,now;
now=len;
for(;;)
{
for(; last<u&&now;)
{
last.add(num[now]);
now--;
}
if(!now&&last<u) break;
for(i=2; i<=9; i++)
{
tmp.init();
tmp.len=1;
tmp.num[1]=i;
tmp=tmp*u;
if(tmp>last) break;
}
last=last+u-tmp;
if(!now) break;
last.add(num[now]);
now--;
for(; !last.num[last.len]&&last.len>=2; last.len--);
}
for(; !last.num[last.len]&&last.len>=2; last.len--);
return last;
}
};