题目描述
输入两个正整数a,b,输出a+b的值。
输入
两行,第一行a,第二行b。a和b的长度均小于1000位。
输出
一行,a+b的值。
样例输入
4
2
样例输出
6
在这里,我用char数组的方式对要操作的数进行存储,之后将其转化为int类型并逆序存储在int数组中。
(1)为什么要逆序存储?
因为两个数在进行运算时,每一位之间相加可能会产生进位的情况,若正序存储,当第一位即num[0]这一位产生进位时,那么就没有更高的num[-1]去存储进位得到的最高位,因此要逆序存储。
(2)解题思路
使用一个while循环使两个数每一位相加,并且把每一位的进位存储到另一个变量carry中,这一位result[pos]得到的结果应该是(num1[pos]+num2[pos]+carry)/10,直到循环到两个数中较长的数最后一位循环结束。
(3)注意,有可能出现最高位仍有进位的情况,这时应该首先在结果最前面输出1。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int main()
{
char a[maxn];
char b[maxn];
cin>>a>>b;
int len1=strlen(a);
int len2=strlen(b);
int num1[maxn]= {0},num2[maxn]= {0},result[maxn]= {0};
/*这里将数组初始化为0是为了防止两个数不一样长的情况,例如
len1=3,len2=2,这样num1[2]+num2[2]时num2[2]的值为0,
若不初始化则该位为空值*/
for(int i=0,j=len1-1; i<len1; i++,j--)
num1[i]=a[j]-'0';
for(int i=0,j=len2-1; i<len2; i++,j--)
num2[i]=b[j]-'0';
int carry=0;
int pos=0;
if(len1>=len2)
while(pos<len1)
{
result[pos]=(num1[pos]+num2[pos]+carry)%10;
carry=(num1[pos]+num2[pos]+carry)/10;
pos++;
}
else
while(pos<len2)
{
result[pos]=(num1[pos]+num2[pos]+carry)%10;
carry=(num1[pos]+num2[pos]+carry)/10;
pos++;
}
if(carry)//最高位有进位的情况
cout<<1;
for(int i=pos-1; i>=0; i--)
cout<<result[i];
cout<<endl;
return 0;
}