[HDOJ] 1753.大明A+B (大数加法)

Problem Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input

本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

Sample Input

1.1 2.9
1.1111111111 2.3444323343
1 1.1

Sample Output

4
3.4555434454
2.1

题意:大数相加
思路:获取小数位置,对齐小数点,两边补零,记录小数点位置,去掉小数点,相加,输出时输出小数点。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int FindDec(string &str) {
  int i;
  int len = str.size();
  for (i = 1; i < len; i++) {
    if (str[i] == '.') break;
  }
  return i;
}

int main() {
  string a, b;

  while (cin >> a >> b) {
    //整数位位数
    int len_int_a = FindDec(a), len_int_b = FindDec(b);
    //小数位位数
    int len_dec_a = a.size() - len_int_a - 1;
    int len_dec_b = b.size() - len_int_b - 1;
    //整书补零
    if (len_int_a > len_int_b)
      for (int i = 0; i < len_int_a - len_int_b; ++i) b = '0' + b;
    else
      for (int i = 0; i < len_int_b - len_int_a; ++i) a = '0' + a;
    //小数补0
    if (len_dec_a > len_dec_b)
      for (int i = 0; i < len_dec_a - len_dec_b; ++i) b = b + '0';
    else
      for (int i = 0; i < len_dec_b - len_dec_a; ++i) a = a + '0';
    //记录小数点位置,去除小数点
    int decPos = max(len_int_a, len_int_b);
    a = a.erase(decPos, 1);
    b = b.erase(decPos, 1);
    //计算
    int car = 0;
    int len = a.size();
    for (int i = len - 1; i >= 0; --i) {
      int x = a[i] - '0', y = b[i] - '0';
      car += (x + y);
      a[i] = (car % 10 + '0');
      car /= 10;
    }
    if (car) {
      a = '1' + a;
      len = a.size();
      decPos += 1;
    }
    //输出
    int i, j;
    for (i = 0; i < len; i++)
      if (a[i] != '0') break;
    for (j = i; j < decPos; j++) cout << a[j];
    for (j = len - 1; j >= decPos; j--)
      if (a[j] != '0') break;
    if (j >= decPos) {
      cout << ".";
      for (i = decPos; i <= j; i++) cout << a[i];
    }
    cout << endl;
  }
  system("pause");
  return 0;
}
原文地址:https://www.cnblogs.com/ruoh3kou/p/9893457.html