题解 | #浮点数加法#
本题的重点是做好数字位置的匹配。对于小数点后的数,下标开始时都指向较短的数字的最后一位,然后不断向前累加,这样就做好了小数点后的数字的计算;对于小数点前的数,也是从两个数字最后一位开始,但此时两个数字的下标不再一致,而是分别指向自己的末尾,这是与小数点后的数的区别,最后将进位做处理即可。
所以分析了这么多,我们可以明显感觉到,应该将数字分成小数点后和小数点前,两块单独处理。
#include <any> #include <bits/stdc++.h> using namespace std; int main() { string num1; string num2; while (cin >> num1 >> num2) { //以点为界限,分为左右两部分 string num1_left = num1.substr(0, num1.find('.')); string num1_right = num1.substr(num1.find('.') + 1, num1.size() - num1.find('.') - 1); string num2_left = num2.substr(0, num2.find('.')); string num2_right = num2.substr(num2.find('.') + 1, num2.size() - num2.find('.') - 1); //保证num1的长度是大于num2的,因为我们的结果是保存在num1里的 if (num1_left.size() < num2_left.size()) swap(num1_left, num2_left); if (num1_right.size() < num2_right.size()) swap(num1_right, num2_right); //先处理小数点右边的计算 int plus = 0; for (int i = num2_right.size() - 1; i >= 0; i--) { int num = (num1_right[i] + num2_right[i] + plus - 2 * '0') % 10; plus = (num1_right[i] + num2_right[i] + plus - 2 * '0') / 10; num1_right[i] = num + '0'; } //再处理小数点左边的计算 int j = num1_left.size() - 1; for (int i = num2_left.size() - 1; i >= 0; i--) { int num = (num1_left[j] + num2_left[i] + plus - 2 * '0') % 10; plus = (num1_left[j] + num2_left[i] + plus - 2 * '0') / 10; num1_left[j] = num + '0'; j--; } while(j >= 0 && plus != 0) { int num = (num1_left[j] + plus - '0') % 10; plus = (num1_left[j] + plus - '0') / 10; num1_left[j] = num + '0'; j--; } if (plus != 0) cout << plus << num1_left << '.' << num1_right; else cout << num1_left << '.' << num1_right; } } // 64 位输出请用 printf("%lld")