题解 | #浮点数加法#

浮点数加法

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;
    }
}

全部评论

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务