问题 1513: [蓝桥杯][算法提高VIP]大数加法(C++)

题目描述
输入两个正整数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;
}

发布了8 篇原创文章 · 获赞 6 · 访问量 228

猜你喜欢

转载自blog.csdn.net/qq_41681570/article/details/104298286