题解 | 浮点数加法
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include <iostream> #include <string> #include <vector> #include <map> using namespace std; /* 0.111111111111111111111111111111 0.111111111111111111111111111111 */ // 截取小数点前部分 string subBeforePoint(string s) { string res; int p = s.find('.'); // 查找小数点位置 res = (p != string::npos) ? s.substr(0, p) : s; // 提取小数点前部分 return res; } // 截取小数点后部分 string subAfterPoint(string s) { string res; int p = s.find('.'); // 查找小数点位置 res = (p != string::npos) ? s.substr(p + 1) : ""; // 提取小数点后部分 return res; } // 对齐 1 表示 int 0 表示 dec int padding(string& l, string& r, bool intOrDec) { // 获取两个字符串的长度 int len1 = l.length(); int len2 = r.length(); // 获取较长字符串的长度 int maxLength = max(len1, len2); if (intOrDec) { // 创建结果字符串并进行补齐 l = string(maxLength - len1, '0') + l; // 在前面补零 r = string(maxLength - len2, '0') + r; // 在前面补零 } else { // 在后面补零 l = l + string(maxLength - len1, '0'); r = r + string(maxLength - len2, '0'); } return maxLength; } void add(string& l, string& r, int length, vector<char>& res, int& carry) { // 从小加到大 for (int i = length - 1; i >= 0; i--) { char n1 = l[i]; char n2 = r[i]; int sum = n1 - '0' + n2 - '0' + carry; carry = sum >= 10 ? 1 : 0; // 判断是否进位 res.insert(res.begin(), sum % 10 + '0'); // 保存结果 } } string addForInt(string& l, string& r, bool isCarry) { int length = padding(l, r, 1); // 对齐 vector<char> res; // 保存结果 int carry = 0; // 进位 if (isCarry) { carry = 1; } add(l, r, length, res, carry); if (carry) { res.insert(res.begin(), '1'); // 最后一次进位 } return string(res.begin(), res.end()); } pair<string, bool> addForDec(string& l, string& r) { int length = padding(l, r, 0); // 对齐 vector<char> res; // 保存结果 int carry = 0; // 进位 add(l, r, length, res, carry); return { string(res.begin(), res.end()), carry == 1 ? true : false } ; } int main() { string n1; string n2; getline(cin, n1); getline(cin, n2); string n1l = subBeforePoint(n1); string n1r = subAfterPoint(n1); string n2l = subBeforePoint(n2); string n2r = subAfterPoint(n2); pair<string, bool> carryForInt = addForDec(n1r, n2r); string intPart = addForInt(n1l, n2l, carryForInt.second); cout << intPart << "." << carryForInt.first << endl; return 0; }