题解 | #浮点数加法#
浮点数加法
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;
}
王道考研机试 文章被收录于专栏
包含考研机试打卡表题目
