大整数相加

原创 2016年05月30日 22:26:16

问题描述:求两个不超过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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

大整数加法计算思路与算法实现

大整数加法
  • lnnnd
  • lnnnd
  • 2016年06月12日 10:17
  • 3319

c++实现两个大整数相加(一)

巨大的整数,比如100位、200位的整数无法用已有的整数类型来表示,那么,怎么求两个大整数的和? 可以采用最原始的方法:逐为相加的方法。因此,我们可以把两个大整数作为两个字符串,字符串从后往前将对应位...
  • weitxing
  • weitxing
  • 2015年09月12日 14:02
  • 6081

Problem B: 大整数的加法运算

Problem B: 大整数的加法运算 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 334  Solved: 226 [Submit][Sta...
  • usher_ou
  • usher_ou
  • 2017年05月02日 17:57
  • 740

C/C++实现大整数加减法

http://115.29.224.174/JudgeOnline/problem.php?id=1053采用存粹的字符串处理,涉及到 数字的优化(符号处理,去零) 字符串数字大小的比较 字符串的加法...
  • qq_26437925
  • qq_26437925
  • 2017年03月18日 16:53
  • 1435

10:大整数加法

原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入有两行,每行是一个不超过200位的非负整数,可能有多余...
  • mayuan2017
  • mayuan2017
  • 2017年09月12日 15:38
  • 290

大整数加法

大整数加法的做法,如同小学做加法运算,从低位加至高位因为考虑的是大整数,long long放不下,因此用char数组暂存,an1[0]存放数的最低位 #include #include #includ...
  • jeiwt
  • jeiwt
  • 2009年12月09日 21:31
  • 10031

大整数的加法和乘法运算

C和C++中整数最大只能表示10位,不能就会溢出,所以出现了如何避免整数溢出的问题。其中一个方法就是使用字符串来表示,使用字符串的长度是没有限制的。 使用字符串表示整数然后进行乘法运算的关键有如下...
  • u012501459
  • u012501459
  • 2015年08月18日 11:08
  • 1876

大整数加法

总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和。 输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。...
  • Wanglinlin_bfcx
  • Wanglinlin_bfcx
  • 2017年02月13日 11:31
  • 1046

C++ std::list实现大整数加法运算

#pragma once #include #include #include using namespace std; class CBigInt { public: CBigI...
  • ClamReason
  • ClamReason
  • 2016年11月18日 12:40
  • 561

高精度计算-大整数加减法

问题描述求两个不超过 200 位的非负整数的和。 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导 0。 输出要求 一行,即相加后的结果。结果里不能有多余的前导 0,即...
  • zwhlxl
  • zwhlxl
  • 2015年05月04日 10:22
  • 2264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大整数相加
举报原因:
原因补充:

(最多只允许输入30个字)