题解 | 浮点数加法

浮点数加法

https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

/*
    0.111111111111111111111111111111
    0.111111111111111111111111111111
*/

// 截取小数点前部分
string subBeforePoint(string s) {
    string res;
    int p = s.find('.'); // 查找小数点位置
    res = (p != string::npos) ? s.substr(0, p) : s; // 提取小数点前部分
    return res;
}
// 截取小数点后部分
string subAfterPoint(string s) {
    string res;
    int p = s.find('.'); // 查找小数点位置
    res = (p != string::npos) ? s.substr(p + 1) : ""; // 提取小数点后部分
    return res;
}
// 对齐 1 表示 int 0 表示 dec
int padding(string& l, string& r, bool intOrDec) {

    // 获取两个字符串的长度
    int len1 = l.length();
    int len2 = r.length();

    // 获取较长字符串的长度
    int maxLength = max(len1, len2);

    if (intOrDec) {
        // 创建结果字符串并进行补齐
        l = string(maxLength - len1, '0') + l; // 在前面补零
        r = string(maxLength - len2, '0') + r; // 在前面补零

    } else {
        // 在后面补零
        l = l + string(maxLength - len1, '0');
        r = r + string(maxLength - len2, '0');
    }

    return maxLength;
}

void add(string& l, string& r, int length, vector<char>& res, int& carry) {
    // 从小加到大
    for (int i = length - 1; i >= 0; i--) {
        char n1 = l[i];
        char n2 = r[i];
        int sum = n1 - '0' + n2 - '0' + carry;

        carry = sum >= 10 ? 1 : 0; // 判断是否进位
        res.insert(res.begin(), sum % 10 + '0'); // 保存结果
    }
}
string addForInt(string& l, string& r, bool isCarry) {

    int length = padding(l, r, 1); // 对齐

    vector<char> res;   // 保存结果
    int carry = 0;      // 进位
    if (isCarry) {
        carry = 1;
    }
    add(l, r, length, res, carry);
    if (carry) {
        res.insert(res.begin(), '1'); // 最后一次进位
    }
    return string(res.begin(), res.end());
}

pair<string, bool> addForDec(string& l, string& r) {

    int length = padding(l, r, 0); // 对齐

    vector<char> res;   // 保存结果
    int carry = 0;      // 进位
    add(l, r, length, res, carry);

    return { string(res.begin(), res.end()), carry == 1 ? true : false } ;
}
int main() {
    string n1;
    string n2;

    getline(cin, n1);
    getline(cin, n2);

    string n1l = subBeforePoint(n1);
    string n1r = subAfterPoint(n1);
    string n2l = subBeforePoint(n2);
    string n2r = subAfterPoint(n2);

    pair<string, bool> carryForInt = addForDec(n1r, n2r);
    string intPart = addForInt(n1l, n2l, carryForInt.second);

    cout << intPart << "." << carryForInt.first << endl;
    return 0;
}

全部评论

相关推荐

Boss上联系了很多都已读不回,是什么问题大佬帮看看
扎哇精神病人:老哥 你本科的时间是不是写错了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务