关键字:浮点数加法,可以用字符串处理一下,转换成大整数加法
题目:
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
示例1
输入
0.111111111111111111111111111111
0.111111111111111111111111111111
输出
0.222222222222222222222222222222
代码:
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
const int maxn = 1010;
int main(){
// freopen("a.txt", "r", stdin);
string s1, s2;
int i, j;
while(cin >> s1 >> s2){
int d1[maxn] = {0}, d2[maxn] = {0}, f1[maxn] = {0}, f2[maxn] = {0}, sumf[maxn] = {0}, sumd[maxn] = {0}, tmp[maxn] = {0};
int len1 = s1.length(), len2 = s2.length();
int d1cnt = 0, d2cnt = 0, f1cnt = 0, f2cnt = 0;
for(i = 0; i < len1; ++i){
if(s1[i] == '.') break;
tmp[d1cnt++] = s1[i] - '0';
}
for(j = 0; j < i; ++j){
d1[j] = tmp[d1cnt - 1 - j];
}
for(++i; i < len1; ++i){
f1[f1cnt++] = s1[i] - '0';
}
for(i = 0; i < len2; ++i){
if(s2[i] == '.') break;
tmp[d2cnt++] = s2[i] - '0';
}
for(j = 0; j < i; ++j){
d2[j] = tmp[d2cnt - 1 - j];
}
for(++i; i < len2; ++i){
f2[f2cnt++] = s2[i] - '0';
}
// 计算小数部分
int maxL2 = max(f1cnt, f2cnt);
int carry = 0;
for(i = maxL2 - 1; i >= 0; --i){
sumf[i] = (carry + f1[i] + f2[i]) % 10;
carry = (carry + f1[i] + f2[i]) / 10;
}
// 计算整数部分
int maxL1 = max(d1cnt, d2cnt);
for(i = 0; i < maxL1; ++i){
sumd[i] = (carry + d1[i] + d2[i]) % 10;
carry = (carry + d1[i] + d2[i]) / 10;
}
if(carry > 0){
sumd[maxL1++] = carry;
}
for(i = maxL1 - 1; i >= 0; --i){
cout << sumd[i];
}
cout << ".";
for(i = 0; i < maxL2; ++i){
cout << sumf[i];
}
cout << endl;
}
}