基本思想:
如果采用补全,可以有效减少长度;
关键点:
无;
#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