华为机试HJ57:高精度整数加法

简介: 华为机试HJ57:高精度整数加法

题目描述:

输入两个用字符串表示的整数,求它们所表示的数之和。

字符串的长度不超过10000。

本题含有多组样例输入。

输入描述:

输入两个字符串。保证字符串只含有'0'~'9'字符

输出描述:

输出求和后的结果

示例:

输入:

9876543210

1234567890


输出:

11111111100

解题思路:

本题通过字符串操作实现超高精度的整数加法。首先输入两个字符串,并判断长短,长字符串为被加数,短字符串为加数;设置进位符,按长字符串倒序开始计算,当短字符串当前位大于等于0时,说明当前处于加法阶段,若两数相加大于10,则进位,刷新result字符串;当加法结束后,还要考虑进位,直到进位完全结束,将剩下的长字符串字符补位;最后别忘了分析下进位符状态,若为true,说明长字符串最高位数字还要进一下位,即前面多个1,完成。

测试代码:

#include <iostream>
#include <string>
using namespace std;
string add(string s1, string s2)
{
  string result,Long,Short;
    // 长+短
  if (s1.size() > s2.size())
  {
    Long = s1;
    Short = s2;
  }
  else {
    Long = s2;
    Short = s1;
  }
  int j = Short.size() - 1;
    //进位符
  bool carry = false;
  for (int i = Long.size() - 1; i >= 0; --i)
  {
        // 加法阶段
    if (j >= 0)
    {
      int temp;
      if (carry)
      {
        temp = int(Long[i] - '0') + int(Short[j] - '0') + 1;
      }
      else {
        temp = int(Long[i] - '0') + int(Short[j] - '0');
      }
      if (temp < 10) {
        result = char(temp + '0') + result;
        carry = false;
      }
      else {
        carry = true;
        temp -= 10;
        result = char(temp + '0') + result;
      }
    }
        // 进位阶段
    else if (carry) {
      int temp = int(Long[i] - '0') + 1;
      if (temp < 10) {
        result = char(temp + '0') + result;
        carry = false;
      }
      else {
        carry = true;
        temp -= 10;
        result = char(temp + '0') + result;
      }
    }
        // 补数阶段
    else {
      result = char(Long[i]) + result;
    }
    --j;
  }
    // 若最后一次操作有进位符的话,说明最终字符串还要在前面加个1,进位
    if(carry)
    {
        result="1"+result;
    }
  return result;
}
int main()
{
  string s1, s2;
  while (cin >> s1 >> s2)
  {
    cout << add(s1, s2) << endl;
  }
  return 0;
}


相关文章
|
5月前
【每日一题Day210】LC1073负二进制数相加 | 模拟
【每日一题Day210】LC1073负二进制数相加 | 模拟
15 0
|
5月前
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
23 0
|
5月前
【每日一题Day299】LC2235两整数相加
【每日一题Day299】LC2235两整数相加
18 0
|
5月前
【每日一题Day169】LC1107负二进制转换 | 模拟进位 位运算
【每日一题Day169】LC1107负二进制转换 | 模拟进位 位运算
17 1
|
5月前
|
存储 C++
[C++/PTA] 矩阵的乘法运算
[C++/PTA] 矩阵的乘法运算
68 0
|
7月前
|
容器
华为机试HJ89:24点运算
华为机试HJ89:24点运算
|
7月前
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
|
7月前
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
7月前
|
C++ Python
华为机试HJ50:四则运算
华为机试HJ50:四则运算
|
11月前
PTA 7-10 大数的乘法(10 分)
PTA 7-10 大数的乘法(10 分)