题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include <iostream> #include <vector> using namespace std; /** 参考acwing:acwing.com/problem/content/submission/code_detail/21333150/ */ void cmp(string &r1, string &r2){//小数部分末尾补0对其 if(r1.length() < r2.length()) r1.insert(r1.length(), r2.length()-r1.length(), '0'); else if(r2.length() < r1.length()) r2.insert(r2.length(), r1.length()-r2.length(), '0'); } //小数部分求和 vector<int> add_right(vector<int> &v1, vector<int> &v2, int &up){ vector<int> v3; int t = 0;//进位 for(int i = 0; i < v1.size(); i ++){ t += v1[i] + v2[i]; v3.push_back(t % 10); t /= 10;//更新进位 } up = t;//up存放小数部分向整数部分的进位 return v3; } //整数部分求和 vector<int> add_left(vector<int> &v1, vector<int> &v2, int down){//down表示小数向整数的进位 if(v1.size() < v2.size()) return add_left(v2, v1, down); vector<int> v3; int t = down; for(int i = 0; i < v1.size(); i ++){//保证v1的长度大于v2 t += v1[i]; if(i < v2.size()) t += v2[i]; v3.push_back(t % 10); t /= 10; } if(t != 0)//最高位进位 v3.push_back(t); return v3; } int main() { string a, b; cin >> a >> b; string al, ar, bl, br; //al、ar分别为第一个浮点数的整数部分、小数部分 al = a.substr(0, a.find('.')); ar = a.substr(a.find('.') + 1); //bl、br同理 bl = b.substr(0, b.find('.')); br = b.substr(b.find('.') + 1); vector<int> a1, a2, b1, b2; cmp(ar, br); //逆序存放,即vector低下标存放低位,相加时先计算低位 for(int i = al.size()-1; i >= 0; i --) a1.push_back(al[i]-'0'); for(int i = ar.size()-1; i >= 0; i --) a2.push_back(ar[i]-'0'); for(int i = bl.size()-1; i >= 0; i --) b1.push_back(bl[i]-'0'); for(int i = br.size()-1; i >= 0; i --) b2.push_back(br[i]-'0'); int t; vector<int> res_right = add_right(a2, b2, t);//t用于传递小数向整数部分的进位 vector<int> res_left = add_left(a1, b1, t); //注意要倒序输出,因为小数部分和整数部分都是从低位开始相加,即从右往左开始计算的,结果的vector中,低下标存放的是低位,应该先输出高位 for(int i = res_left.size()-1; i >= 0; i --) cout << res_left[i]; cout << '.'; for(int i = res_right.size()-1; i >= 0; i --) cout << res_right[i]; return 0; } // 64 位输出请用 printf("%lld")