题解 | 浮点数加法
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include<vector>
using namespace std;
//求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj 对于整数部分,P1P2...Pi是一个非负整数 对于小数部分,Qj不等于0
//输入描述:
//对于每组案例,每组测试数据占2行,分别是两个加数。
//输出描述:
//每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数
string subfirst(string& s1)
{
return(s1.substr(0, s1.find('.')));
}
string sublast(string& s1)
{
return(s1.substr(s1.find('.'), s1.size() - s1.find('.')));
}
void test01()
{
string a, b;
while (cin >> a >> b)
{
string ia, ib, fa, fb;
ia = subfirst(a);
ib = subfirst(b);
fa = sublast(a);
fb = sublast(b);
// 【修改1】处理小数部分:先去掉小数点再补齐位数(避免小数点参与计算)
string fa_no_dot = fa.substr(1);// 去掉小数点,只保留小数数字
string fb_no_dot = fb.substr(1);
// 重新补齐小数部分位数(基于去掉小数点后的字符串)
if (fa_no_dot.size() < fb_no_dot.size())
{
while (fa_no_dot.size() < fb_no_dot.size())
{
fa_no_dot.push_back('0');
}
}
else if (fa_no_dot.size() > fb_no_dot.size())
{
while (fa_no_dot.size() > fb_no_dot.size())
{
fb_no_dot.push_back('0');
}
}
int carry = 0;
// 【修改2】初始化小数结果字符串(长度和补齐后的小数部分一致,初始化为'0')
string fSum(fa_no_dot.size(), '0');
// 小数部分循环(基于去掉小数点后的字符串,索引从size-1到0)
for (int i = fa_no_dot.size() - 1; i >= 0; i--)
{
// 【修改3】先计算总和(包含进位),再判断是否超过9
int sum = (fa_no_dot[i] - '0') + (fb_no_dot[i] - '0') + carry;
if (sum > 9)
{
fSum[i] = (sum - 10) + '0'; // 【修改4】数字转回字符(加'0')
carry = 1;
}
else
{
fSum[i] = sum + '0'; // 【修改4】数字转回字符(加'0')
carry = 0;
}
}
//整数部分
if (ia.size() < ib.size())
{
int len = ib.size() - ia.size();
ia.insert(0, len, '0');
}
else if (ia.size() > ib.size())
{
int len = ia.size() - ib.size();
ib.insert(0, len, '0');
}
// 【修改5】初始化整数结果字符串(长度和补齐后的整数部分一致,初始化为'0')
string ISum(ia.size(), '0');
// 【修改6】整数循环索引从size-1到0(原代码是i>0,漏了i=0)
for (int i = ia.size() - 1; i >= 0; i--)
{
// 【修改3】先计算总和(包含进位),再判断是否超过9
int sum = (ia[i] - '0') + (ib[i] - '0') + carry;
if (sum > 9)
{
ISum[i] = (sum - 10) + '0'; // 【修改4】数字转回字符(加'0')
carry = 1;
}
else
{
ISum[i] = sum + '0'; // 【修改4】数字转回字符(加'0')
carry = 0;
}
}
// 【修改7】处理整数部分最后的进位(比如999+2=1001)
if (carry > 0)
{
ISum = "1" + ISum;
}
// 【修改8】去掉小数部分末尾的0(保证小数部分不为空)
while (!fSum.empty() && fSum.back() == '0')
{
fSum.pop_back();
}
cout << ISum << "." << fSum << endl;
}
}
int main()
{
test01();
return 0;
}
查看10道真题和解析