题解 | 浮点数加法

浮点数加法

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;
}

全部评论

相关推荐

03-08 18:11
门头沟学院 Java
Java抽象小篮子:海投就完事了,简历没什么问题,最大问题是学历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务