高精度小数求和

M-高精度小数求和_哈尔滨华德学院天梯赛选拔赛(重现赛) (nowcoder.com)

1. 将小数点前后的数字用0补齐

2. 处理最后的小数点位数容易不清楚   用char ans[ ]数组储存,然后进行操作

3. 去除前导0的思想

while(C.back( ) == 0 && C.size( ) > 1) C.pop_back( );

while(ans[cnt] == '0' && ans[cnt - 1] != '.') cnt--;

#include <bits/stdc++.h>

using namespace std;

string a,b;
vector<int> A,B,C;

void opt(int n,int m)
{
	for(int i = n;i >= 0;i--) 
	  if(a[i] != '.') A.push_back(a[i] - '0');
	for(int i = m;i >= 0;i--) 
	  if(b[i] != '.') B.push_back(b[i] - '0');
}

void add(vector<int> &A,vector<int> &B)
{
	int t = 0;
	for(int i = 0;i < A.size();i++)
	{
		if(i < B.size()) t += B[i];
		t += A[i];
		C.push_back(t % 10);
		t /= 10;
	}
	if(t) C.push_back(t);
}

int main()
{
	cin >> a >> b;

	int x = a.size() - a.find('.') - 1,sx = a.find('.');
	int y = b.size() - b.find('.') - 1,sy = b.find('.');
	
	for(int i = 0;i <= max(x,y);i++)
	{
		if(x <= i) a += '0'; // 最后一位多补一个0  确保小数点后至少有一位0
		if(y <= i) b += '0';
	}
	
	for(int i = 0;i <= max(sx,sy);i++)
	{
		if(sx < i) a.insert(a.begin(),'0'); // 不用多补一个0
		if(sy < i) b.insert(b.begin(),'0');
	}
	
	opt(a.size() - 1,b.size() - 1);
	add(A,B);
	
	char ans[410];
	int cnt = 0;
	for(int i = C.size() - 1;i >= 0;i--)
	{
		if(i == max(x,y)) ans[++cnt] = '.';
		ans[++cnt] = C[i] + '0';
	}
	
	while(ans[cnt] == '0' && ans[cnt - 1] != '.') cnt--; // 去除多余的0
	
	for(int i = 1;i <= cnt;i++) cout << ans[i];
	
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值