基本思想:
如果采用补全,可以有效减少长度;
关键点:
无;
#include<iostream> #include<vector> #include<string> #include<sstream> #include<algorithm> using namespace std; vector<string> charge(string s) { int index; string b; vector<string>vec; stringstream ss(s); while (getline(ss, b, ‘.‘)) { vec.push_back(b); } return vec; } string add(string a, string b,int &ca) { int max = -1; string rn=""; if (a.size() > b.size()) { max = b.size(); rn = a.substr(max, a.size() - max); } else if(a.size()<b.size()){ max = a.size(); rn = b.substr(max, b.size() - max); } else { max = a.size(); } int carry = 0; string res=""; for (int i = max - 1; i >= 0; i--) { int temp = (a[i] - ‘0‘) + (b[i] - ‘0‘) + carry; res = char(‘0‘ + temp % 10)+res; carry = temp / 10; } ca = carry; res += rn; while (res.size()!=0&&res[res.size() - 1] == ‘0‘) res.pop_back(); return res; } string add_in(string a, string b,int cn) { reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int carry = cn; string res = ""; for (int i = 0; i < a.size() && i < b.size(); i++) { int temp= (a[i] - ‘0‘) + (b[i] - ‘0‘) + carry; res = res + char(‘0‘ + temp % 10); carry = temp / 10; } if (res.size() < a.size()) { for (int i = res.size(); i < a.size(); i++) { if (carry == 0) res += a[i]; else { int temp = (a[i] - ‘0‘) + carry; res += char(‘0‘ + temp % 10); carry = temp / 10; } } if (carry != 0) res += ‘1‘; } else if (res.size() < b.size()) { for (int i = res.size(); i < b.size(); i++) { if (carry == 0) res += b[i]; else { int temp = (b[i] - ‘0‘) + carry; res += char(‘0‘ + temp % 10); carry = temp / 10; } } if (carry != 0) res += ‘1‘; } else { if (carry != 0) res += ‘1‘; } reverse(res.begin(), res.end()); return res; } int main() { string s1, s2; while (cin >> s1 >> s2) { vector<string>ss1 = charge(s1); vector<string>ss2 = charge(s2); int carry = 0; string res = add(ss1[1], ss2[1], carry); string res_in = add_in(ss1[0], ss2[0], carry); cout<<res_in<< "." << res << endl; } }
北京大学机试 浮点数加法 Easy *字符串加和,注意补全的简便方法
原文:https://www.cnblogs.com/songlinxuan/p/12460027.html