#include<iostream>
#include<algorithm>
using namespace std;
//must fulfil ina >= inb, otherwise "Error" pop out
string lSub(const string& ina,const string& inb){
string a=ina,b=inb;
while(a.size()!=b.size())
a.size()>b.size() ? b.insert(b.begin(),'0') : a.insert(a.begin(),'0');
string ans;
int sub,num,app=0;
for(int i=a.size()-1;i>=0;i--){
sub=a[i]-b[i]-app;
num=(10+sub)%10;
ans.push_back('0'+num);
app= sub<0 ? 1 : 0;
}
if(app) cout<<"Error in lSub: ina < inb !"<<endl;
int r=ans.size();
while(--r>0&&ans[r]=='0') ans.pop_back();
reverse(ans.begin(),ans.end());
return ans;
}
//To implement lMul: lAdd is reused
string lAdd(const string& ina,const string& inb){
string a=ina,b=inb;
while(a.size()!=b.size())
a.size()>b.size() ? b.insert(b.begin(),'0') : a.insert(a.begin(),'0');
string ans;
int sum,num,app=0;
for(int i=a.size()-1;i>=0;i--){
sum=a[i]-'0'+b[i]-'0'+app;
num=sum%10;
ans.push_back('0'+num);
app=sum/10;
}
if(app) ans.push_back('0'+app);
int r=ans.size();
while(--r>0&&ans[r]=='0') ans.pop_back();
reverse(ans.begin(),ans.end());
return ans;
}
string lMul(const string& ina,const string& inb){
string b=inb,ans;
for(int i=ina.size()-1;i>=0;i--){
string rans;
int pro,num,app=0;
for(int j=b.size()-1;j>=0;j--){
pro=(b[j]-'0')*(ina[i]-'0')+app;
num=pro%10;
rans.push_back('0'+num);
app=pro/10;
}
if(app) rans.push_back('0'+app);
int r=rans.size();
while(--r>0&&rans[r]=='0') rans.pop_back();
reverse(rans.begin(),rans.end());
ans=lAdd(ans,rans);
b.push_back('0');
}
return ans;
}
string llMul(const string& ina,const string& inb){
if(ina.size()<10||inb.size()<10) return lMul(ina,inb);
int n=min(ina.size(),inb.size());
n-=n/2;
string a0=ina.substr(0,ina.size()-n);
string a1=ina.substr(ina.size()-n);
string b0=inb.substr(0,inb.size()-n);
string b1=inb.substr(inb.size()-n);
string c0=llMul(a0,b0);
string c2=llMul(a1,b1);
string c1=lSub(lSub(llMul(lAdd(a0,a1),lAdd(b0,b1)),c0),c2);
for(int i=0;i<2*n;i++)
c0.push_back('0');
for(int i=0;i<n;i++)
c1.push_back('0');
return lAdd(lAdd(c0,c1),c2);
}
int main(){
string a,b;
cin>>a>>b;
cout<<lMul(a,b)<<endl;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 1 s | 180 KB | Time Limit Exceeded | Score: 0 | 显示更多 |