题解 | 浮点数加法

// 大致思路是:如123456789.987 + 789.123456变成如下
// 	 0123456789.987000
//   +	 0000000789.123456
//   =   0123457579.110456
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

void leftPadding(string& str, int len) {
    len -= str.size();
    while (len--) {
        str = '0' + str;
    }
}

void rightPadding(string& str, int len) {
    len -= str.size();
    while (len--) {
        str += '0';
    }
}

string sum(string str1, string str2) {
    int carry = 0;  // 进位
    string res; // 存放结果
    string::reverse_iterator it1 = str1.rbegin();
    string::reverse_iterator it2 = str2.rbegin();
    while (it1 != str1.rend()) {
        int num = *it1 - '0' + *it2 - '0' + carry;
        int left = num % 10;
        carry = num / 10;
        res = (char)(left + '0') + res;
        it1++;
        it2++;
    }
    return res;
}

int main() {
    string f1, f2;  // 输入的两个浮点数
    string H1, L1;  // 浮点数1的整数部分和小数部分
    string H2, L2;  // 浮点数2的整数部分和小数部分
    cin >> f1 >> f2;
    H1 = f1.substr(0, f1.find('.'));
    L1 = f1.substr(f1.find('.') + 1);
    H2 = f2.substr(0, f2.find('.'));
    L2 = f2.substr(f2.find('.') + 1);
    // 防止最高位进位,故在左边多留一个0
    int left = H1.size() > H2.size() ? H1.size() + 1 : H2.size() + 1;
    int right = L1.size() > L2.size() ? L1.size() : L2.size();
    leftPadding(H1, left);
    leftPadding(H2, left);
    rightPadding(L1, right);
    rightPadding(L2, right);
    string res = sum(H1 + L1, H2 + L2);
    int i = 0;
    // 若最高位为0则不输出,否则输出
    if (res[0] == '1')
        cout << res[0];
    for (i = 1; i < left; i++) {
        cout << res[i];
    }
    cout << '.';
    for (; i < res.length(); i++)
        cout << res[i];
    cout << endl;

    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务