题解 | #浮点数加法#

浮点数加法

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

思路

字符串读入,先对齐小数点(前补0),再转化为int数组(可能要后补0使得两个浮点数位数一致),方便进行竖式运算;

运算规则:从右往左,a+b+进位

注意进位:两个数相加结果最多比原来的数多一位

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;

int main() {

    string str1, str2;
    getline(cin, str1);
    getline(cin, str2);

    //寻找str1和str2小数点的位置
    int idx1 = str1.find('.', 0);
    int idx2 = str2.find('.', 0);

    //前补0使str1和str2小数点对齐 
    if (idx1 > idx2) { //需要在str2前面补0
        int cha = idx1 - idx2;
        string tmp;
        while (cha--) tmp += '0';
        tmp += str2;
        str2 = tmp;
    } else if (idx1 < idx2) {
        int cha = idx2 - idx1;
        string tmp;
        while (cha--) tmp += '0';
        tmp += str1;
        str1 = tmp;
    }

    //后补0方便竖式运算
    int len = max(str1.size(), str2.size()); //总位数(包含小数点)
    
	while(str1.size() < len){
		str1.push_back('0');
	}
	
	while(str2.size() < len){
		str2.push_back('0');
	} 
 
	//将string存为int数组,一位存0,防止进位
    vector<int> vec1 = {0};//用vec1保存结果
    vector<int> vec2 = {0};

    //将str转为vec
    for (int i = 0; i < len; i++) {
        if (str1[i] == '.') {
            vec1.push_back(-1);//vect存-1代表小数点
            vec2.push_back(-1);
            continue;
        }
        
        vec1.push_back(str1[i] - '0');
        vec2.push_back(str2[i] - '0');
    }

    //计算
    int jin = 0;//进位
    for (int i = len; i >= 0; i--) {
        if (vec1[i] == -1) continue; //遇到小数点跳过
        vec1[i] = vec1[i] + vec2[i] + jin;//当前位
        jin = vec1[i] / 10;//更新进位 
        vec1[i] = vec1[i] % 10;
    }
	
	//输出 
    for (int i = 0; i <= len; i++) {
        if (i == 0 && vec1[0] == 0) continue;
        if (vec1[i] == -1) {
            cout << '.';
            continue;
        }
        cout << vec1[i];
    }

    cout << endl;

    return 0;
}

王道考研机试 文章被收录于专栏

包含考研机试打卡表题目

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务