1.加法
以字符串形式输入,然后逆向存在初始值为0的数组中。做加法运算时,先初始化进位标志为0。从低位到高位,res[i]=(a[i]+b[i]+carry)%10; carry=(a[i]+b[i]+carry)/10;循环次数为最长的数字位数(因为已经初始化为0,继续进行加法不会影响结果)
例:
题目描述
输入两个大整数a和b,输出这两个整数的和。a和b都不超过100位。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a + b的值。
输入样例
20100122201001221234567890 2010012220100122
输出样例
20100122203011233454668012
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
int carry=0;
cin>>a>>b;
int la=a.size();
int lb=b.size();
int a1[500]={0},b1[500]={0};
for(int i=0;i<la;i++){
a1[a.size()-1-i]=a[i]-'0';
}
for(int j=0;j<lb;j++){
b1[b.size()-1-j]=b[j]-'0';
}
if(la>=lb){
for(int i=0;i<la;i++){
int r=a1[i];
a1[i]=(b1[i]+a1[i]+carry)%10;
carry=(b1[i]+r+carry)/10;
}
if(carry){
a1[la]=carry;
}
else la--;
for(int k=la;k>=0;k--){
cout<<a1[k];
}
cout<<endl;
return 0;
}
else{
for(int i=0;i<lb;i++){
int r=b1[i];
b1[i]=(b1[i]+a1[i]+carry)%10;
carry=(a1[i]+r+carry)/10;
}
if(carry>0){
b1[lb]+=carry;
}
else lb--;
for(int i=lb;i>=0;i--){
cout<<b1[i];
}
cout<<endl;
return 0;
}
}
2.减法
减法的坑比加法多。(1)做减法运算前判断两个数的大小关系,习惯上使第一个数更大,若A<B,则使用swap函数交换两数,并做标记,以便结果输出的时候加上负号。ps:判断两数大小:若两个数位数相同,且字符串A<B,则A<B;若A的数位比B短,则A<B。(2)借位的表示 若第一个数位不够减,则从更高一位借10,加到该位上,同时高位-1。运算循环次数同样为较长的数的位数,因为已经初始化为0。(3)输出时前导0的处理。从高位到低位依次判断,若该位为0,则结果数组的长度-1,直到第一个不为0的数位为止。如果结果数组的长度已经变为0,则直接输出0,结束算法。
例:
题目描述
输入两个大整数a和b,输出这a-b的结果。a和b都不超过100位。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a - b的值。
输入样例
111111111111111111111111 111111111111111111111111
输出样例
0
数据范围与提示
结果可能为负数
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b;
bool flag=0;
cin>>a>>b;
int la=a.size(),lb=b.size();
int a1[500]={0},b1[500]={0},ans[500]={0};
if(a.size()==b.size()&&a<b||a.size()<b.size())
{
flag=1;
swap(a,b);
}
la=a.size();lb=b.size();
for(int i=0;i<la;i++){
a1[i]=a[la-1-i]-'0';
}
for(int i=0;i<lb;i++){
b1[i]=b[lb-1-i]-'0';
}
//cout<<a.size()<<" "<<b.size()<<endl;
if(la>=lb){
for(int i=0;i<la;i++){
if(a1[i]<b1[i]){
a1[i+1]--;
a1[i]+=10;
}
ans[i]=a1[i]-b1[i];
}
}
if(flag==1) cout<<"-";
while(ans[la-1]==0) la--;
if(la<=0) {cout<<"0"<<endl;
return 0;}
for(int i=la-1;i>=0;i--){
cout<<ans[i];
}
cout<<endl;
return 0;
}