在洛谷上看到的关于大数加减乘除的算法,[原算法地址](https://www.luogu.com.cn/blog/user28954/solution-p1601)
自己稍做了一些改动之后,贴在这里,希望更多人看到,总的思路就是模拟手算
1.string 的erase以及find_first_not_of(),swap的用法
2.字符串随意拼接的用法
#include<bits/stdc++.h>
using namespace std;
void moveFrontZero(string&a)
{
a.erase(0,a.find_first_not_of('0'));
if(a.empty())a="0";
}
void align(string&a,string&b)
{
int a_size=a.size();
int b_size=b.size();
if(a_size<b_size)
{
for(int i=1;i<=b_size-a_size;i++)
{
a="0"+a;
}
}
else
{
for(int i=1;i<=a_size-b_size;i++)
{
b="0"+b;
}
}
}
string add(string a,string b)
{
moveFrontZero(a);
moveFrontZero(b);
string answer="";
align(a,b);
int temp=0,jw=0;
for(int i=a.size()-1;i>=0;i--)
{
temp=a[i]-'0'+b[i]-'0'+jw;
jw=temp/10;
temp%=10;
answer=(char)(temp+'0')+answer;
}
if(jw)answer=(char)(jw+'0')+answer;
moveFrontZero(answer);
return answer;
}
string sub(string a,string b)
{
moveFrontZero(a);
moveFrontZero(b);
align(a,b);
bool is_minus=false;
if(a<b)
{
is_minus=true;
a.swap(b);
}
string answer="";
int temp=0,jw=0;
for(int i=a.size()-1;i>=0;i--)
{
if(a[i]<b[i]+jw)
{
temp=a[i]+10-b[i]-jw;
jw=1;
answer=(char)(temp+'0')+answer;
}else
{
temp=a[i]-b[i]-jw;
jw=0;
answer=(char)(temp+'0')+answer;
}
}
moveFrontZero(answer);
if(is_minus)answer="-"+answer;
return answer;
}
string mul(string a,string b)
{
moveFrontZero(a);
moveFrontZero(b);
string answer="";
for(int i=a.size()-1;i>=0;i--)
{
string temp="";
for(int j=1;j<=a.size()-1-i;j++)
{
temp+="0";
}
int s=0,jw=0;
for(int j=b.size()-1;j>=0;j--)
{
s=(a[i]-'0')*(b[j]-'0')+jw;
jw=s/10;
s%=10;
temp=(char)(s+'0')+temp;
}
if(jw)temp=(char)(jw+'0')+temp;
answer=add(answer,temp);
}
moveFrontZero(answer);
return answer;
}
string div(string a,string b)
{
moveFrontZero(a);
moveFrontZero(b);
string answer="";
string reminder="";
reminder.append(a,0,b.size()-1);
for(int i=b.size()-1;i<a.size();i++)
{
reminder=reminder+a[i];
moveFrontZero(reminder);
for(char j='9';j>='0';j--)
{
string temp="";
temp=temp+j;
temp=mul(b,temp);
align(temp,reminder);
if(temp<=reminder)
{
answer=answer+j;
reminder=sub(reminder,temp);
break;
}
}
}
moveFrontZero(answer);
cout<<"reminder="<<reminder<<endl;
return answer;
}
int main()
{
string a,b;
cin>>a>>b;
cout<<sub(a,b)<<endl;
cout<<add(a,b)<<endl;
cout<<mul(a,b)<<endl;
cout<<div(a,b)<<endl;
return 0;
}