高精算数
#include<bits/stdc++.h>
using namespace std;
string a,b,ys;
bool compare(string _a,string _b)
{
if(_a.size()>_b.size())return true;
else if(_a.size()<_b.size())return false;
for(int i=0;i<_a.size();i++)
{
if(_a[i]>_b[i])return true;
else if(_a[i]<_b[i])return false;
}
return true;
}
string sum(string _a,string _b)
{
int al=_a.size(),bl=_b.size(),t=0;
int mxl=max(al,bl);
string ans="";
if(al>bl)
{
for(int i=0;i<al-bl;i++)
_b='0'+_b;
}
else if(al<bl)
{
for(int i=0;i<bl-al;i++)
_a='0'+_a;
}
for(int i=mxl-1;i>=0;i--)
{
char x=(((_a[i]-'0')+(_b[i]-'0')+t)%10)+'0';
ans=x+ans;
if(((_a[i]-'0')+(_b[i]-'0')+t)>=10)
t=1;
else t=0;
}
if(t==1)ans="1"+ans;
return ans;
}
string subtraction(string _a,string _b)
{
string fh="";
if(compare(_a,_b)==false)
{
string p=_a;
_a=_b;
_b=p;
fh="-";
}
int al=_a.size(),bl=_b.size();
int mxl=max(al,bl);
string ans="";
for(int i=0;i<al-bl;i++)
_b='0'+_b;
for(int i=mxl-1;i>=0;i--)
{
ans=(char)((((_a[i]-'0')+(int)(_a[i]<_b[i])*10)-(_b[i]-'0'))+'0')+ans;
if(_a[i]<_b[i])
{
_a[i-1]-=1;
if(_a[i]<'0')_a[i]='9';
}
}
int j=ans.size();
for(int i=0;i<j-1;i++)
{
if(ans[0]!='0')
break;
ans.erase(0,1);
}
ans=fh+ans;
return ans;
}
string time_(string _a,string _b)
{
int al=_a.size(),bl=_b.size(),t=0;
string ans="0";
int cnt=0;
for(int i=bl-1;i>=0;i--)
{
string n="";
for(int j=al-1;j>=0;j--)
{
n=(char)(((_a[j]-'0')*(_b[i]-'0')+t)%10+'0')+n;
t=((_a[j]-'0')*(_b[i]-'0')+t)/10;
}
n=(char)(t+'0')+n;
t=0;
for(int j=0;j<cnt;j++)
n=n+'0';
cnt++;
ans=sum(ans,n);
}
int j=ans.size();
for(int i=0;i<j-1;i++)
{
if(ans[0]!='0')
break;
ans.erase(0,1);
}
return ans;
}
string divides_(string _a,string _b)
{
string ans="";
if(compare(_a,_b)==false)
{
ys=_a;
return "0";
}
string cp="";
cp=_a.substr(0,_b.size()-1);
for(int i=_b.size()-1;i<_a.size();i++)
{
cp=cp+_a[i];
int j;
if(compare(cp,b)==false)
{
ans=ans+'0';
if(i==_a.size()-1)ys=cp;
continue;
}
for(j=1;;j++)
{
if(compare(subtraction(cp,_b),_b)==false||subtraction(cp,_b)=="0")break;
cp=subtraction(cp,_b);
}
cp=subtraction(cp,_b);
ans=ans+(char)(j+'0');
if(i==_a.size()-1)ys=cp;
if(cp[0]=='0')cp.erase(0,1);
}
int j=ans.size();
for(int i=0;i<j-1;i++)
{
if(ans[0]!='0')
break;
ans.erase(0,1);
}
j=ys.size();
for(int i=0;i<j-1;i++)
{
if(ys[0]!='0')
break;
ys.erase(0,1);
}
return ans;
}
int main()
{
cin>>a>>b;
cout<<sum(a,b)<<endl;
cout<<subtraction(a,b)<<endl;
cout<<time_(a,b)<<endl;
cout<<divides_(a,b)<<endl;
cout<<ys;
return 0;
}