题目描述
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj
对于整数部分,P1P2…Pi是一个非负整数
对于小数部分,Qj不等于0
输入
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
输出
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
样例输入
2
3.756
90.564
4543.5435
43.25
样例输出
94.32
4586.7935
思路:使用string直接模拟加法过程,先对齐小数点和补充0使得两个浮点数长短一样,然后从最低位到最高位进行模拟,遇到小数点时直接跳过,最后记得去除后缀0。
例如:4543.5435+43.25,先找到小数点,补充前缀0和后缀0使其对齐,再模拟加法过程。
4543.5435
0043.2500
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
scanf("%d", &n);
string num1, num2;
while (n--) {
getchar(); //吸收换行符
getline(cin, num1);
getline(cin, num2);
int pos1 = num1.find('.'), pos2 = num2.find('.'); //找到小数点位置
if (pos1 > pos2) { //对齐两个数的小数点,补充前缀0
num2.insert(0, pos1 - pos2, '0');
} else {
num1.insert(0, pos2 - pos1, '0');
}
if (num1.length() > num2.length()) { //补充后缀0
num2.insert(num2.length(), num1.length() - num2.length(), '0');
} else {
num1.insert(num1.length(), num2.length() - num1.length(), '0');
}
int carry = 0; //进位
for (int i = num1.length() - 1; i >= 0; i--) { //把最终结果存储在num1
if (num1[i] == '.') continue; //跳过小数点
num1[i] += num2[i] - '0' + carry; //对应位相加
carry = (num1[i] - '0') / 10; //得到进位
num1[i] = (num1[i] - '0') % 10 + '0'; //个位数为该位结果
}
if (carry) num1.insert(0, 1, '1'); //如果最后进位不为0,最高位为1
for (int i = num1.length() - 1; i >= 0; i--) {
if (num1[i] != '0') break; //遇到第一个不为0的数停止
if (num1[i] == '0') num1.erase(i, 1); //去除后缀0
}
cout << num1 << endl;
}
return 0;
}