题解 | 浮点数加法 补'0',各各位相加 ASCII相加 '0'='0' '1'='0'+1

浮点数加法

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

#include <iostream>
#include <string>
using namespace std;

// 获取整数部分
string getInteger(string a) {
    // 从0开始 截取a.find(".")长度
    // 截取[ ) 左闭右开区间
    return a.substr(0, a.find("."));
}
// 获取小数部分
string getFraction(string a) {
    // a.size()实际长度,但是下标要-1。 find()得到的为下标
    // 从a.find(".") + 1开始 截取a.size() - a.find(".")长度
    // 截取[ ) 左闭右开区间(所以加1)
    // 从"."后开始截取(不含".") 截取长度刚好 长度=(结尾 - "."后一位 + 1)
    //return a.substr(a.find(".")+1,a.size()-1-a.find(".")-1+1);
    // 多截取一位,但是字符串结束了
    return a.substr(a.find(".") + 1, a.size() - a.find("."));
}

// 当需要返回多个值时。使用引用参数 返回信息
void fractionPlus(string& res, int& carry, string fa, string fb) {
    // 长度小的字符串 补0对齐
    int size = max(fa.size(), fb.size()); // 返回较大字符串长度
    while (fa.size() < size) {
        fa.push_back('0');  // 补0
    }
    while (fb.size() < size) {
        fb.push_back('0');  // 补0
    }
    // 申请空间才能用res[i],否则像vector没申请空间越界
    res.resize(size);  // 给res申请两者中最大空间
    carry = 0;  // 最低一位进位为0
    for (int i = size - 1; i >= 0; i--) { // 从最低位开始计算

        // '0' = '0' 字符0 不为数字0,为字符0 ASCII码大小超过0
        // '3' = '0' + 3  字符3(大于0的n)为 字符0 + 数字3(n)
        // '0' + '3'(字符相加) ='0' + 3(前面就为结果'3') + '0'(多余的)
        // 所以要减去字符0
        if (fa[i] + fb[i] - '0' + carry > '9') { // 有进位
            res[i] = fa[i] + fb[i] - '0' + carry - 10;  // 取余数 -10
            carry = 1;
        } else { // 无进位
            res[i] = fa[i] + fb[i] - '0' +
                     carry; // 没有进位也要加上 低位的 进位
            carry = 0;
        }
    }
}

// 小数部分才需要获取向整数的进位,不用引用carry
void integerPlus(string&  res, int carry, string ia, string ib) {
    int size = max(ia.size(), ib.size());
    while (ia.size() < size) {
        ia.insert(ia.begin(), '0');  // 前置补0
    }
    while (ib.size() < size) {
        ib.insert(ib.begin(), '0'); // 前置补0
    }
    res.resize(size);  // 给res申请两者中最大空间
    for (int i = size - 1; i >= 0; i--) {  // 从最低位开始计算
        if (ia[i] + ib[i] - '0' + carry > '9') { // 有进位
            res[i] = ia[i] + ib[i] - '0' + carry - 10;  // 取余数 -10
            carry = 1;
        } else { // 无进位
            res[i] = ia[i] + ib[i] - '0' +
                     carry;  // 没有进位也要加上 低位的 进位
            carry = 0;
        }
    }
    if (carry == 1) {
        res.insert(res.begin(), '1'); // 最后有进位
    }
}


int main() {
    string a ;
    string b ;
    while (cin >> a >> b) {
        string ia = getInteger(a);
        string ib = getInteger(b);
        string fa = getFraction(a);
        string fb = getFraction(b);

        string fres;  // 小数部分结果
        int carry;  // 进位比较小,用int。 除了小数部分最后一位进位为0,其它都根据计算为依据
        fractionPlus(fres, carry, fa, fb);
        string ires;  // 整数部分结果
        integerPlus(ires, carry, ia, ib);

        cout << ires << "." << fres << endl;
    }
    return 0;
}

#考研##复试练习#
2025考研复试 文章被收录于专栏

复试ing,努力中。。。

全部评论

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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