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