#include<bits/stdc++.h>
using namespace std;
struct bigint{
int WIDTH=8;
int BASE=1e8;
static const int NUMSIZE=10000;
int sign;//sign为-1是负数,1是正数
int len;
int num[NUMSIZE];
bigint(){
len=1,sign=1;
memset(num,0,sizeof num);
}
bigint(string s){
sign=1,len=ceil(((int)s.length())*1.0/WIDTH);
bool ____k=(((int)s.length())%WIDTH);
if(s[0]=='-')
sign=-1,len=ceil((((int)s.length())-1)*1.0/WIDTH),____k=((((int)s.length())-1)%WIDTH);
if(____k)
num[len]=stoi(s.substr(((sign==1)?0:1),((((int)s.length())-(sign==1?0:1))%WIDTH)));
for(int i=(____k?len-1:len);i>=1;--i)
num[i]=stoi(s.substr(((int)s.length())-WIDTH*i,WIDTH));
clear();
}
bigint(int x){
if(x<0)
sign=-1,x=-x;
else
sign=1;
memset(num,0,sizeof num);
len=0;
do{
++len;
num[len]=x%BASE;
x/=BASE;
}
while(x);
clear();
}
bigint(long long x){
if(x<0)
sign=-1,x=-x;
else
sign=1;
memset(num,0,sizeof num);
len=0;
do{
++len;
num[len]=x%BASE;
x/=BASE;
}
while(x);
clear();
}
int stoi(string s){
int x=0;
for(int i=0;i<((int)s.length());++i)
x=x*10+s[i]-'0';
return x;//return std::stoi(s);
}
void clear(){
while(len>1&&num[len]==0)
num[len--]=0;
if(len==1&&num[len]==0&&sign==-1)
sign=1;
return;
}
void print(char c=' ',bool mode=0){
if(!mode){
if(sign==-1)
putchar('-');
printf("%d",num[len]);
for(int i=len-1;i>=1;--i)
printf("%08d",num[i]);
putchar(c);
return;
}
for(int i=1;i<=len;++i)
cout<<"num,"<<i<<":"<<num[i]<<'\n';
cout<<"len:"<<len<<" sign:"<<sign;
puts("");
return;
}
bigint operator-(){
bigint ans=(*this);
if(!(ans.len==1&&ans.sign==1&&ans.num[len]==0))
ans.sign*=-1;
return ans;
}
bigint operator+(bigint x){
if(x.sign==-1&&sign==1)
return (*this)-(-x);
if(sign==-1&&x.sign==1)
return x-(-(*this));
bigint ans;
if(sign==-1&&x.sign==-1)
ans.sign=-1;
ans.len=max(len,x.len)+1;
for(int i=1;i<=ans.len;++i){
ans.num[i]+=num[i]+x.num[i];
ans.num[i+1]=ans.num[i]/BASE;
ans.num[i]=ans.num[i]%BASE;
}
ans.clear();
return ans;
}
int cmp_bigint(bigint x,bigint y){//1代表等于,2代表小于,3代表大于
if(x.sign<y.sign)//x负y正
return 2;
if(x.sign>y.sign)//x正y负
return 3;
if(x.sign==-1){//都是负
if(x.len>y.len)//x长y短
return 2;
if(x.len<y.len)//y长x短
return 3;
for(int i=x.len;i>=1;--i){
if(x.num[i]>y.num[i])
return 2;
if(x.num[i]<y.num[i])
return 3;
}
return 1;
}
if(x.sign==1){//都是正
if(x.len>y.len)//x长y短
return 3;
if(x.len<y.len)//y长x短
return 2;
for(int i=x.len;i>=1;--i){
if(x.num[i]>y.num[i])
return 3;
if(x.num[i]<y.num[i])
return 2;
}
return 1;
}
throw invalid_argument("cmp_bigint wrong");
}
bool operator<(bigint x){
return cmp_bigint((*this),x)==2;
}
bool operator>(bigint x){
return cmp_bigint((*this),x)==3;
}
bool operator==(bigint x){
return cmp_bigint((*this),x)==1;
}
bigint operator-(bigint x){
if(x.sign==-1)
return (*this)+(-x);
if(sign==-1)
return (*this)+(-x);
if((*this)<x)
return -(x-(*this));
bigint ans;
ans.len=len;
for(int i=1;i<=ans.len;++i){
ans.num[i]+=num[i]-x.num[i]+BASE;
ans.num[i+1]=ans.num[i]/BASE-1;
ans.num[i]%=BASE;
}
ans.clear();
return ans;
}
bigint operator*(bigint x){
if(x==1)
return (*this);
puts("111");
if((*this)==1)
return x;
puts("111");
if(x==0||(*this)==0)
return 0;
puts("111");
bigint ans;
ans.len=len+x.len;
if((x.sign==-1&&sign==1)||(sign==-1&&x.sign==1))
ans.sign=-1;
long long tmp_ans[NUMSIZE*NUMSIZE];
for(int i=1;i<=len;++i)
for(int j=1;j<=x.len;++j){
tmp_ans[i+j-1]+=num[i]*x.num[i];
tmp_ans[i+j]+=tmp_ans[i+j-1]/BASE;
tmp_ans[i+j-1]%=BASE;
}
for(int i=1;i<=ans.len;++i)
ans.num[i]=tmp_ans[i];
ans.clear();
return ans;
}
};
int main(){
string sa,sb;
cin>>sa>>sb;
bigint a=sa,b=sb;
a=a*b;
a.print();
return 0;
}
201行报错的。
是哪里的问题?