实数加法(高精度训练) —— C++

求两个实数相加的和。

题目中输入输出里出现的浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。

输入
2行,每行是一个加数。每个加数的长度不超过100。

输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。

样例输入

0.111111111111111111111111111111
0.111111111111111111111111111111

样例输出

0.222222222222222222222222222222

思路
A:000aa.bb000
B:ccccc.ddddd
对于输入的两个数,缺位补零,使其位数相等,从右至左上下相加,满十进一,最后处理小数部分末尾可能出现的 0 。
代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main() {
	string a, b; cin >> a >> b;
	int az = a.find(".");//a 的整数部分长度
	int bz = b.find(".");
	int ax = a.length() - az - 1;//a 的小数部分长度
	int bx = b.length() - bz - 1;
	int z, x;//整数、小数部分的最长长度
	az > bz ? z = az : z = bz;
	ax > bx ? x = ax : x = bx;
	string saz = a.substr(0, az);//a 的整数部分
	string sax = a.substr(az + 1);//a 的小数部分
	string sbz = b.substr(0, bz);
	string sbx = b.substr(bz + 1);
	while (saz.size() != z)//整数部分补零
		saz = "0" + saz;
	while (sbz.size() != z)
		sbz = "0" + sbz;
	while (sax.size() != x)//小数部分补零
		sax = sax + "0";
	while (sbx.size() != x)
		sbx = sbx + "0";
	int c = 0;
	string xiao = "", zheng = "";
	for (int i = x - 1; i >= 0; i--) {//字符转 int :char -‘0’;int 转字符:4 + ‘0’
		xiao += ((c + (sax[i] - '0') + (sbx[i] - '0')) % 10 + '0');
		c = (c + (sax[i] - '0') + (sbx[i] - '0')) / 10;
	}
	for (int i = z - 1; i >= 0; i--) {
		zheng += ((c + (saz[i] - '0') + (sbz[i] - '0')) % 10 + '0');
		c = (c + (saz[i] - '0') + (sbz[i] - '0')) / 10;
	}
	if(c!=0)
		zheng += (c + '0');
	int k;//小数部分去零
	for (k=0;k<xiao.length();k++)
		if (xiao[k] != '0')
			break;
	reverse(zheng.begin(), zheng.end());
	cout << zheng << ".";
	for (int i = xiao.length() - 1; i >= k; i--)
		cout << xiao[i];
	cout << endl;
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值