ZJUT1291(浮点A+B)

浮点A+B
Time Limit:1000MS  Memory Limit:32768K

Description:

小红在数学方面很有天赋,虽然还只有一年级,其他同学还只能计算十以内的加减,可她却能够进行小数的加减了。现在,给你两个小数A和B,你的任务是代表小红计算出A+B的值。

Input:

本题目包含多组测试数据,每组测试数据包含正小数A和B。小数长度不超过100。

Output:

请在一行里面输出输出A+B的值,注意小数尾部不能留有多余的0。

Sample Input:

1.1 2.9
1.1111 2.3444
1 1.1
1 2

Sample Output:

4
3.4555
2.1
3

这道题简单来说就是多位数的加法,关于多位数的加法操作,方法就是模拟,即按照我们做竖式的方法来做。本题我的做法是将浮点数分别拆
开成整数部分和小数部分,两个部分都可以作为多位数的加法分别相加,最后将整数部分和小数部分再进行一个合并就可以。要注意的地方有
两点:第一点是小数部分最后的进位,要加到整数部分去;第二点是千万不要
忘了题目提醒的去掉尾部的零。

代码如下:
#include<iostream>
#include<iomanip>
#include<vector>
#include<algorithm>
#include<map>
#include<string>


using namespace std;

string bigIntAdd(string a,string b)
{
	string sum,tmp;
	int carry = 0;

	if(a.size() > b.size())
	{
		swap(a,b);
	}

	sum = string(b.size(),'0');
	a = string(b.size() - a.size(),'0') + a;

	for(int i = b.size() - 1 ; i >= 0 ; i--)
	{
		sum[i] = (carry + (b[i] - 48) + (a[i] - 48))%10 + 48;

		carry = (carry + (b[i] - 48) + (a[i] - 48))/10;
	}

	if(carry != 0)
	{
		tmp += carry + 48;
		sum = tmp + sum;
	}

	return sum;
	

}


string bigDecimelAdd(string &a , string &b)
{
	string sum,tmp;
	int carry = 0;

	if(a.size() > b.size())
	{
		swap(a,b);
	}

	sum = string(b.size(),'0');
	a =  a + string(b.size() - a.size(),'0');

	for(int i = b.size() - 1 ; i >= 0 ; i--)
	{
		sum[i] = (carry + (b[i] - 48) + (a[i] - 48))%10 + 48;

		carry = (carry + (b[i] - 48) + (a[i] - 48))/10;
	}

	a = sum ;

	if(carry != 0)
	{
		return "1";
	}
	else
		return "0";
}

int main()
{
	string s1,s2,aInt,bInt,aDec,bDec,carry,sumInt,sumDec;
	while(cin>>s1>>s2)
	{

		if(s1.find(".") == string::npos)
		{
			aInt = s1;
			aDec = "0";
		}
		else
		{
			aInt = s1.substr(0,s1.find("."));
			aDec = s1.substr(s1.find(".")+1);
		}
		
		if(s2.find(".") == string::npos)
		{
			bInt = s2;
			bDec = "0";
		}
		else
		{
			bInt = s2.substr(0,s2.find("."));
			bDec = s2.substr(s2.find(".")+1);
		}
		

		sumInt = bigIntAdd(aInt,bInt);

		carry = bigDecimelAdd(aDec,bDec);

		sumDec = bigIntAdd(sumInt,carry);

		while(!aDec.empty() &&aDec[aDec.size()-1] == '0')
		{
			aDec = aDec.substr(0,aDec.size()-1);
		}
		if(aDec.empty())
			cout<<sumDec<<endl;
		else
			cout<<sumDec<<"."<<aDec<<endl;
	}
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值