您的位置:首页 > 其它

九度oj 1137

2015-07-31 20:34 295 查看
题目描述:

求2个浮点数相加的和

题目中输入输出中出现浮点数都有如下的形式:

P1P2...Pi.Q1Q2...Qj

对于整数部分,P1P2...Pi是一个非负整数

对于小数部分,Qj不等于0
输入:

对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。

每组测试数据之间有一个空行,每行数据不超过100个字符
输出:

每组案例是n行,每组测试数据有一行输出是相应的和。

输出保证一定是一个小数部分不为0的浮点数
样例输入:
2
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445

样例输出:
0.222222222222222222222222222222
10000002.1

来源:
2008年北京大学软件所计算机研究生机试真题
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
int n;
cin >> n;
while (n--) {
string a, b, res, rem;
cin >> a >> b;
int p1 = a.find('.');
int p2 = b.find('.');
int q1 = a.length() - p1 - 1;
int q2 = b.length() - p2 - 1;
int i, j;
if (q1 > q2) {
i = p1 + q2;
rem = a.substr(i + 1);
j = b.length() - 1;
} else if (q1 < q2) {
i = a.length() - 1;
j = p2 + q1;
rem = b.substr(j + 1);
} else {
i = a.length() - 1;
j = b.length() - 1;
}
int jw = 0;
for (; i >= 0 && j >= 0; --i, --j) {
if (a[i] == '.' && b[j] == '.') {
res.push_back('.');
continue;
}
int tmp = a[i] - '0' + b[j] - '0' + jw;
jw = tmp / 10;
res.push_back('0' + tmp % 10);
}
while (i >= 0) {
int tmp = a[i] - '0' + jw;
jw = tmp / 10;
res.push_back('0' + tmp % 10);
--i;
}
while (j >= 0) {
int tmp = b[j] - '0' + jw;
jw = tmp / 10;
res.push_back('0' + tmp % 10);
--j;
}
if (jw) {
res.push_back('0' + jw);
}
if (rem.empty()) {
for (int i = 0; i < res.length(); ++i) {
if (res[i] != '0') {
res = res.substr(i);
break;
}
}
reverse(res.begin(), res.end());
if (res[res.length() - 1] == '.') {
res.push_back('0');
}
} else {
reverse(res.begin(), res.end());
res += rem;
}
cout << res << endl;
}
return 0;
}

此题有一定难度啊!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: