题解 | #浮点数加法#

浮点数加法

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

#include <iostream>
#include <vector>
using namespace std;
/**
参考acwing:acwing.com/problem/content/submission/code_detail/21333150/
*/
void cmp(string &r1, string &r2){//小数部分末尾补0对其
    if(r1.length() < r2.length()) r1.insert(r1.length(), r2.length()-r1.length(), '0');
    else if(r2.length() < r1.length()) r2.insert(r2.length(), r1.length()-r2.length(), '0');
}
//小数部分求和
vector<int> add_right(vector<int> &v1, vector<int> &v2, int &up){
    vector<int> v3;
    int t = 0;//进位
    for(int i = 0; i < v1.size(); i ++){
        t += v1[i] + v2[i];
        v3.push_back(t % 10);
        t /= 10;//更新进位
    }
    up = t;//up存放小数部分向整数部分的进位
    return v3;
}

//整数部分求和
vector<int> add_left(vector<int> &v1, vector<int> &v2, int down){//down表示小数向整数的进位
    if(v1.size() < v2.size())
        return add_left(v2, v1, down);
    vector<int> v3;
    int t = down;
    for(int i = 0; i < v1.size(); i ++){//保证v1的长度大于v2
        t += v1[i];
        if(i < v2.size())
            t += v2[i];
        v3.push_back(t % 10);
        t /= 10;
    }
    if(t != 0)//最高位进位
        v3.push_back(t);
    return v3;
}
int main() {
    string a, b;
    cin >> a >> b;
    string al, ar, bl, br;
    //al、ar分别为第一个浮点数的整数部分、小数部分
    al = a.substr(0, a.find('.'));
    ar = a.substr(a.find('.') + 1);
    //bl、br同理
    bl = b.substr(0, b.find('.'));
    br = b.substr(b.find('.') + 1);

    vector<int> a1, a2, b1, b2;
    cmp(ar, br);
    //逆序存放,即vector低下标存放低位,相加时先计算低位
    for(int i = al.size()-1; i >= 0; i --) a1.push_back(al[i]-'0');
    for(int i = ar.size()-1; i >= 0; i --) a2.push_back(ar[i]-'0');
    for(int i = bl.size()-1; i >= 0; i --) b1.push_back(bl[i]-'0');
    for(int i = br.size()-1; i >= 0; i --) b2.push_back(br[i]-'0');

    int t;
    vector<int> res_right = add_right(a2, b2, t);//t用于传递小数向整数部分的进位
    vector<int> res_left = add_left(a1, b1, t);

    //注意要倒序输出,因为小数部分和整数部分都是从低位开始相加,即从右往左开始计算的,结果的vector中,低下标存放的是低位,应该先输出高位
    for(int i = res_left.size()-1; i >= 0; i --) cout << res_left[i];
    cout << '.';
    for(int i = res_right.size()-1; i >= 0; i --) cout << res_right[i];
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

nbdy:字太多了,写简历不是写自传,亮点难点技能点列出来就行,要简明扼要
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务