大整数相加

问题描述:求两个不超过200位的非负整数的和。

输入:有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出:一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入:

22222222222222222222

33333333333333333333

样例输出:

55555555555555555555


完整代码:

#include <iostream>
#include <string.h>

int main()
{
    unsigned a1[200] = {0}, a2[200] = {0};
    char s1[200] = {'0'}, s2[200] = {'0'}, s[200] = {'0'};
    int j = 0, a, b, max;

    gets(s1);
    gets(s2);
//确定和的最大长度(两个字符串中较长的那个长度大小);

    a = strlen(s1), b = strlen(s2);
    max = b;if (a >= b) max = a;
//将字符串逆序依次变成数字,这样问题就转化成两个个位数相加;

    for (int i(strlen(s1) - 1); i >= 0; --i)
        a1[j++] = s1[i] - '0';
    j = 0;
    for (int i(strlen(s2) - 1); i >= 0; --i)
        a2[j++] = s2[i] - '0';
//计算,按位对数字数组进行运算,然后存到相应字符数组里(数字字符和数字中间的差为‘0’(48),转换的时候按需加减就好);

    for (j = 0; j != max; ++j)
    {
//相加取余为当前元素(7,8 当前元素就为5):
        s[j] = (s[j] - '0' + (a1[j]+a2[j])%10 + '0');
//如果相加之后的结果大于‘10’,则需进位,到下一位上:
	s[j+1] =(a1[j]+a2[j])/10+'0';
//可能会出现运算完成之后当前元素为‘10’的情况,可是并没有这个元素这个时候会出错显示‘:’,这个时候需要将当前置为0,然后向上进位
        if (s[j] == 58) { s[j] = '0'; s[j+1]++;}
    }
//如果最后一个的下一个元素结果不为‘0’,说明两数相加产生进位有了比之前更大的位数,这是要把和的长度在原有基础上变大
    if (s[j] != '0') max++;
//因为使用字符数组的逆序整形数组运算,所以结果刚好相反,逆序输出存放计算结果的字符串就好:

    for (j = max-1; j >= 0; --j)
        std::cout << s[j];
    std::cout << std::endl;

    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lmj_like_c/article/details/51541695
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭