#include<iostream>
#include<algorithm>
using namespace std;
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;
}
//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 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;
}
//postive: ina > inb, zero: ina == inb, negative: ina < inb
int lCmp(const string& ina,const string& inb){
int i=0,j=0;
while(i<ina.size()-1&&ina[i]=='0') i++;
while(j<inb.size()-1&&inb[j]=='0') j++;
string a=ina.substr(i),b=inb.substr(j);
if(a.size()==b.size()) return a.compare(b);
return a.size()-b.size();
}
//To implement lDiv: lAdd, lSub, lMul and lCmp are reused
//Cannot be divided by zero
string lDiv(const string& ina,const string& inb){
int i=0,j=0;
while(i<ina.size()-1&&ina[i]=='0') i++;
while(j<inb.size()-1&&inb[j]=='0') j++;
string a=ina.substr(i),b=inb.substr(j);
string ans="0";
while(lCmp(a,b)>=0){
int inc=0;
while(a.size()!=b.size()){
b.push_back('0');
inc++;
}
if(a.compare(b)<0){
b.pop_back();
inc--;
}
int div=2;
while(lCmp(a,lMul(to_string(div),b))>=0) div++;
div--;
a=lSub(a,lMul(to_string(div),b));
b.erase(b.end()-inc,b.end());
string rans(inc+1,'0');
rans[0]='0'+div;
ans=lAdd(ans,rans);
}
return ans;
}
int main(){
string a,b;
cin>>a>>b;
cout<<lDiv(a,b)<<endl;
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 1 s | 192 KB | Time Limit Exceeded | Score: 0 | 显示更多 |