题解 | #浮点数加法#

浮点数加法

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

纯字符串的方法,利用0~10的ascii和设置进位位(CF)分别计算小数和整数,仅供参考。

//
// Created by alphatk on 2023/1/18.
//
# include "iostream"
# include "string"

using namespace std;

// 本题代码写的不是很优异,仅供参考

class num {             // 将输入的数封装成类(struct同理)
public:
    int sizeLeft;       // 整数部分
    int sizeRight;      // 小数部分
    string data;        // 数据部分
    num(string input) { // 构造函数:求出整数部分、小数部分长度
        data = input;
        int i = 0;
        sizeLeft = sizeRight = 0;
        while (input[i++] != '.') sizeLeft++;
        sizeRight = input.size() - sizeLeft - 1;
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // Define:
    string str1, str2;
    // Input:
    cin >> str1;
    num res(str1);
    while (cin >> str2) {               // 可进行多轮加法
        num addNum(str2);               // 创建类
        int CarryFlag = 0, i = 0;       // 小数侧进位标志
        string newNum;

        // 【右侧】计算小数部分:开始计算的位置应该是较小的数的最后一位,多出的部分直接复制
        if (res.sizeRight > addNum.sizeRight) {
            newNum += res.data.substr(res.sizeLeft + 1 + addNum.sizeRight);
            i = addNum.sizeRight-1;
        } else {
            newNum += addNum.data.substr(addNum.sizeLeft + 1 + res.sizeRight);
            i = res.sizeRight-1;
        }
        for (; i>=0; --i) {
            char culculate;             // 当前位的计算
            culculate = (res.data[res.sizeLeft+1+i] - '0' + addNum.data[addNum.sizeLeft+1+i] - '0') + '0';
            if (CarryFlag == 1) {       // 如果上一次计算有进位
                culculate += 1;
                CarryFlag = 0;
            }
            if (culculate > '9') {      // 如果本次计算有进位
                CarryFlag = 1;
                culculate -= 10;
            }
            newNum = culculate + newNum; // 形成新的字符串(采用左拼接)
        }
        newNum = '.' + newNum;

        // 【左侧】计算
        int j = res.sizeLeft - 1;       // 整数部分计算的起始位置
        int k = addNum.sizeLeft - 1;
        while (j >= 0 || k >= 0) {
            char culculate;
            if (j >= 0 && k >= 0) culculate = (res.data[j] - '0' + addNum.data[k] - '0') + '0';
            else if (j >= 0 && k < 0) culculate = res.data[j];
            else
                culculate = addNum.data[k];
            if (CarryFlag == 1) {   // 进位
                culculate += 1;
                CarryFlag = 0;
            }
            if (culculate > '9') {
                CarryFlag = 1;
                culculate -= 10;
            }
            newNum = culculate + newNum;
            j--;
            k--;
        }
        cout << newNum << endl;
        return 0;
    }
}

全部评论

相关推荐

牛客52811839...:实习要写出来业务和产出,你这写的像流水账没人看。项目经历也没有,换个极简简历试试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8359次浏览 76人参与
# 你的实习产出是真实的还是包装的? #
1557次浏览 39人参与
# 米连集团26产品管培生项目 #
5435次浏览 213人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7300次浏览 40人参与
# 简历第一个项目做什么 #
31444次浏览 320人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186719次浏览 1118人参与
# 巨人网络春招 #
11282次浏览 223人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152201次浏览 887人参与
# 研究所笔面经互助 #
118829次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433235次浏览 3926人参与
# 简历中的项目经历要怎么写? #
309862次浏览 4177人参与
# 面试紧张时你会有什么表现? #
30460次浏览 188人参与
# 你今年的平均薪资是多少? #
212910次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63173次浏览 784人参与
# 我的求职精神状态 #
447925次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76352次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
363053次浏览 2635人参与
# 你怎么看待AI面试 #
179703次浏览 1220人参与
# 牛客AI文生图 #
21391次浏览 237人参与
# 职能管理面试记录 #
10773次浏览 59人参与
# 网易游戏笔试 #
6422次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160527次浏览 1109人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务