其实我从小就不喜欢高精度……
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
typedef long long LL;
struct HP{
int len,s[maxn],f;
HP(){
clear();
}
void clear(){
memset(s,0,sizeof(s));
len=1;f=1;
}
HP operator=(const char *num){
if(*num=='-')f=-1;
while(*num=='0'||*num=='-')num++;
len=strlen(num);
if(!len){
s[len++]=0;
return *this;
}
for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
return *this;
}
HP operator=(const int num){
char c[20];
sprintf(c,"%d",num);
return *this=c;
}
HP operator+(const HP &b)const{
HP c;c.len=0;
for(int i=0,g=0;g||i<max(len,b.len);i++){
int x=g;
if(i<len)x+=s[i];
if(i<b.len)x+=b.s[i];
c.s[c.len++]=x%10;
g=x/10;
}return c;
}
HP operator-(HP b){
HP c;c.len=0;
if(*this<b){
c=b-*this;c.f=-1;return c;
}for(int i=0,g=0;i<len;i++){
int x=s[i]-g;
if(i<b.len)x-=b.s[i];
if(x>=0)g=0;
else{
g=1;x+=10;
}c.s[c.len++]=x;
}c.clean();
return c;
}
HP operator*(const HP &b)const{
HP c;c.len=len+b.len;
c.f=((f==-1)^(b.f==-1))?-1:1;
for(int i=0;i<len;i++)
for(int j=0;j<b.len;j++)
c.s[i+j]+=s[i]*b.s[j];
for(int i=0;i<c.len;i++){
c.s[i+1]+=c.s[i]/10;
c.s[i]%=10;
}c.clean();
return c;
}
bool operator<(const HP &b)const{
if(len!=b.len)return (len<b.len)^(f==-1);
for(int i=len-1;i>=0;i--)
if(s[i]!=b.s[i])return (s[i]<b.s[i])^(f==-1);
return 0^(f==-1);
}
bool operator==(const HP &b)const{
if(len!=b.len||f!=b.f)return false;
for(int i=0;i<len;i++)if(s[i]!=b.s[i])return false;
return true;
}
void clean(){
while(len>1&&s[len-1]==0)len--;
if(len==1&&s[0]==0)f=1;
}
void print(){if(f==-1)putchar('-');for(int i=len-1;i>=0;i--)printf("%d",s[i]);}
int toint(){int res=0;for(int i=0;i<len;i++)res=res*10+s[i];return res;}
LL toLL(){LL res=0;for(int i=0;i<len;i++)res=res*10+s[i];return res;}
};
int main(){
char s1[maxn],s2[maxn];
scanf("%s%s",s1,s2);
HP a,b;
a=s1;
b=s2;
(a*b).print();
return 0;
}