(一)两个非负的浮点数相加
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <vector>
using namespace std;
// 判断是否含有小数点
bool has_dot(string num) {
for(int i = 0; i < num.length(); ++i)
if(num[i] == '.')
return true;
return false;
}
// 获取小数点的位置
int get_dot_pos(string num) {
for(int i = 0; i < num.length(); ++i)
if(num[i] == '.')
return i;
}
// 删除小数后面的尾数0
string del_tail_zero(string num) {
while(*(num.end() - 1) == '0')
num.erase(num.end() - 1);
if(*(num.end() - 1) == '.')
num.erase(num.end() - 1);
return num;
}
string add(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string sum = "";
int carry = 0;
for(int i = 0; i < a.length(); ++i) {
int s = (a[i] - '0') + (b[i] - '0') + carry;
sum = sum + char(s % 10 + '0');
carry = s / 10;
}
if(carry == 1)
sum.append("1");
reverse(sum.begin(), sum.end());
return sum;
}
string get_sum(string a, string b) {
bool a_has_dot = has_dot(a), b_has_dot = has_dot(b); // 全部转化成小数处理
if(a_has_dot && !b_has_dot) {
b.append(".0");
}
else if(!has_dot && b_has_dot) {
a.append(".0");
}
else if(!a_has_dot && !b_has_dot) {
a.append(".0");
b.append(".0");
}
int a_dot_pos = get_dot_pos(a), b_dot_pos = get_dot_pos(b); // 小数点位置
string a_int = a.substr(0, a_dot_pos), b_int = b.substr(0, b_dot_pos); // 获取整数部分
string a_float = a.substr(a_dot_pos + 1, a.length() - a_dot_pos - 1), b_float = b.substr(b_dot_pos + 1, b.length() - b_dot_pos - 1); // 获取小数部分
int int_add_length = abs(int(a_int.length() - b_int.length())), float_add_length = abs(int(a_float.length() - b_float.length())); // 判断整数和小数上的位数是否相同
if(int_add_length != 0) { // 使a和b的整数位位数相同
if(a_int.length() > b_int.length()) {
reverse(b_int.begin(), b_int.end());
for(int i = 0; i < int_add_length; ++i)
b_int.append("0");
reverse(b_int.begin(), b_int.end());
}
else {
reverse(a_int.begin(), a_int.end());
for(int i = 0; i < int_add_length; ++i)
a_int.append("0");
reverse(a_int.begin(), a_int.end());
}
}
if(float_add_length != 0) { // 使a和b的小数位位数相同
if(a_float.length() > b_float.length()) {
for(int i = 0; i < float_add_length; ++i)
b_float.append("0");
}
else {
for(int i = 0; i < float_add_length; ++i)
a_float.append("0");
}
}
string int_ans = add(a_int, b_int); // 整数部分的和
string float_ans = add(a_float, b_float); // 小数部分的和
if(float_ans.length() > a_float.length()) { // 小数位产生进位
int_ans = add(int_ans, "1");
float_ans.erase(float_ans.begin());
}
string ans = "";
ans.append(int_ans);
ans.append(".");
ans.append(float_ans);
return del_tail_zero(ans);
}
int main() {
freopen("1.txt", "r", stdin);
string a, b;
while(cin >> a >> b) {
cout << get_sum(a, b) << endl;
}
return 0;
}
(二)任意两个浮点数相加