所谓的大整数是指数位很多的整数,例如整数A有1000位,而此时超过了整型的表示范围,因此需要寻求新的表示方法。
可以使用string类型来表示大整数,这里实现大整数运算的加法和减法。
加法逻辑:对于两个数的加法,从低位开始相加,需考虑进位.
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string a,b,ans; //大整数a+b
cin>>a>>b;
reverse(a.begin(),a.end()); //从低位加到高位,因此先逆转字符串方便计算
reverse(b.begin(),b.end());
int num=max(a.size(),b.size());
int temp,p=0; //p表示进位,temp表示每次加的和
for(int i=0;i<num;i++)
{
int num1=i<a.size()? a[i]-'0':0;
int num2=i<b.size()? b[i]-'0':0;
temp=num1+num2+p;
p=temp/10;
ans+=temp%10+'0';
}
if(p!=0) ans+=p+'0';
reverse(ans.begin(),ans.end());
cout<<ans;
}
减法实现:需考虑两个数大小,比较。需考虑借位
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string a,b,ans;
cin>>a>>b;
if(a.size()<b.size()) //比较大小,
{
cout<<"-";
swap(a,b);
}else if(a<b)
{
cout<<"-";
swap(a,b);
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int num=max(a.size(),b.size());
int temp,flag=0; //flag表示此次相减是否需借位,temp表示每次加的和
for(int i=0;i<num;i++)
{
int num1=i<a.size()? a[i]-'0':0;
int num2=i<b.size()? b[i]-'0':0;
if(flag==1) {num1--;}
if(num1>=num2) {temp=num1-num2; flag=0;} //flag=0,表示不用借位
else
{
num1+=10;
temp=num1-num2;
flag=1;
}
ans+=temp+'0';
}
reverse(ans.begin(),ans.end());
while(ans.size()>1&&ans[0]=='0') //去除前导零
{
ans.erase(ans.begin());
}
cout<<ans;
return 0;
}