为增进鲁棒代码能力和提高代码效率(卡常)能力,重构高精度模板
#include<bits/stdc++.h>
using namespace std;
struct Bignum
{
#define LL long long
#define siz 1005
#define bit 1
#define bitsiz 10
LL s[siz],l,neg;
Bignum(LL a=0)
{
neg = (a < 0);
for(l=0;a;) s[l++] = a % bitsiz , a /= bitsiz;
s[l] = 0;
}
void cin()
{
char ch;neg = l = 0;
for(;!isdigit(ch=getchar());) if(ch == '-') neg = 1;
for(s[l++]=ch-'0';isdigit(ch=getchar());s[l++]=ch-'0');
for(int i=0;i<l-i-1;i++) swap(s[i],s[l-i-1]);
s[l] = 0;
}
void cout()
{
if(neg) printf("-");
for(int i=max(0ll,l-1);i>=0;i--) printf("%d",s[i]);
}
Bignum sum(const Bignum &B)const
{
Bignum ret(0);
ret.l=max(l,B.l);
int tmp;
for(int i=0;i<ret.l;i++)
{
ret.s[i+1] = 0;
ret.s[i] += s[i] + B.s[i];
if(ret.s[i] > 9)
ret.s[i+1] += (tmp=ret.s[i] / 10),
ret.s[i] -= tmp * 10;
}
for(;ret.s[ret.l];ret.l++)
{
ret.s[ret.l+1]=0;
if(ret.s[ret.l]>9)
ret.s[ret.l+1] += (tmp=ret.s[ret.l] / 10),
ret.s[ret.l] -= tmp * 10;
}
return ret;
}
Bignum sub(const Bignum &B)const // require abs(*this) >= abs(B)
{
Bignum ret(0);
ret.l=max(l,B.l);
int tmp;
for(int i=0;i<ret.l;i++)
{
ret.s[i+1] = 0;
ret.s[i] += s[i] - B.s[i];
if(ret.s[i] < 0)
ret.s[i+1] += (tmp=ret.s[i] / 10 - (ret.s[i]%10!=0)),
ret.s[i] -= tmp * 10;
}
for(;ret.l>=0 && !ret.s[ret.l];ret.l--);
ret.l++;
return ret;
}
bool absles(const Bignum &B)const
{
if(l!=B.l) return l < B.l;
for(int i=l-1;i>=0;i--)
if(s[i]!=B.s[i])
return s[i]<B.s[i];
return 1;
}
Bignum operator +(const Bignum &B)const
{
Bignum ret;
if(neg ^ B.neg)
{
if((*this).absles(B)) ret = B.sub(*this),ret.neg = B.neg;
else ret = (*this).sub(B) , ret . neg = (*this).neg;
}
else
{
ret = (*this) . sum(B);
ret . neg = neg;
}
if(ret . l == 0) ret.neg = 0;
return ret;
}
Bignum operator -(const Bignum &B)const
{
Bignum ret(0);
if(!(neg ^ B.neg))
{
if((*this).absles(B))
ret = B.sub(*this),ret.neg = B.neg^1;
else
ret=(*this).sub(B) , ret . neg = (*this).neg;
}
else
{
ret = (*this).sum(B);
ret . neg = neg;
}
if(ret . l == 0) ret.neg = 0;
return ret;
}
Bignum operator *(const Bignum &B)const
{
Bignum ret(0);
ret.neg = neg ^ B.neg;
ret.l = l + B.l;
int tmp;
for(int i=0;i<l;i++)
for(int j=0;j<B.l;j++)
ret.s[i+j] += s[i] * B.s[j];
for(int i=0;i<ret.l;i++)
if(ret.s[i] > 9)
ret.s[i+1] += (tmp = ret.s[i] / 10),
ret.s[i] -= tmp * 10;
for(;ret.s[ret.l];ret.l++)
if(ret.s[ret.l] > 9)
ret.s[ret.l+1] += (tmp = ret.s[ret.l] / 10),
ret.s[ret.l] -= tmp * 10;
for(;ret.l>=0 && !ret.s[ret.l];ret.l--);
ret.l++;
return ret;
}
pair<Bignum,int> operator /(const int &B)const
{
Bignum ret=*this;
for(int i=ret.l-1;i>0;i--)
{
ret.s[i-1] += 10ll * (ret.s[i] % B);
ret.s[i] /= B;
}
int res = ret.s[0] % B;
ret.s[0]/=B;
for(;ret.l >= 0 && !ret.s[ret.l];ret.l--);
ret.l++;
return make_pair(ret,res);
}
}A;
int B;
int main()
{
A.cin(),scanf("%d",&B);
pair<Bignum,int>tmp = A/B;
tmp.first.cout();
printf("\n");
printf("%d\n",tmp.second);
}