大整数加法

问题描述:
求两个不超过200位的非负整数的和。
输入数据
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出要求
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例
22222222222222222222
33333333333333333333
输出样例
55555555555555555555

解题思路:

1) 用字符型或整型数组来存放大整数
an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……
2)模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。
用unsigned an1[201]保存第一个数,用unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1中。要注意处理进位。

#include <iostream>
#include <cstring>
#define MAXLINE 200
using namespace std;
char s1[MAXLINE + 10];
char s2[MAXLINE + 10];
int nLen1;
int nLen2;
int Add(int MaxLen, int *a1, int *a2)
{
    int nHighesePos = 0;
    for(int i = 0; i < MaxLen; ++i)
    {
        //将长度最多为nMaxLen的大整数an1和an2相加,结果放在an1,an1[0],an2[0],对应于个位
        a1[i] += a2[i];
        if(a1[i] >= 10)
        {
            a1[i] -= 10;
            a1[i + 1]++;
        }
        if(a1[i + 1])
        nHighesePos = i + 1;
    }
    return nHighesePos;
}
//求最大值
int Max(int x, int y)
{
    return ((x > y) ? x : y);
}
int main()
{
    cin >> s1;
    cin >> s2;
    nLen1 = strlen(s1);
    nLen2 = strlen(s2);
    int *a1 = new int[MAXLINE + 10]();//数组长度后面的一对(),对数组元素做值初始化,可以把数组元素值都设置为0
    int *a2 = new int[MAXLINE + 10]();//对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组
                                      //变量一样,用初始化列表为数组元素提供各不相同的初值
    int MaxLen = Max(nLen1, nLen2);
     //将地址an1开始的sizeof(an1)字节内容置成0
    /*for(int i = 0; i <= MaxLen; ++i)
    {
        a1[i] = 0;
        a2[i] = 0;
    }*/
    //将字符转换为十进制数存储在a1[i]和a2[i]中
    for(int i = nLen1 - 1, j = 0; 0 <= i; --i)
    {
        a1[j++] = s1[i] - '0';
    }

    for(int i = nLen2 - 1, j = 0; 0 <= i; --i)
    {
        a2[j++] = s2[i] - '0';
    }
    int Pos = Add(MaxLen, a1, a2);
    //输出各位
    for(int i = Pos; 0 <= i; --i)
    cout << a1[i];
    delete [] a1;
    delete [] a2;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值