ZJUT1291(浮点A+B)

来源:互联网 发布:二手房数据 编辑:程序博客网 时间:2024/05/16 05:23

浮点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.91.1111 2.34441 1.11 2

Sample Output:

43.45552.13这道题简单来说就是多位数的加法,关于多位数的加法操作,方法就是模拟,即按照我们做竖式的方法来做。本题我的做法是将浮点数分别拆开成整数部分和小数部分,两个部分都可以作为多位数的加法分别相加,最后将整数部分和小数部分再进行一个合并就可以。要注意的地方有两点:第一点是小数部分最后的进位,要加到整数部分去;第二点是千万不要忘了题目提醒的去掉尾部的零。代码如下:
#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";}elsereturn "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;elsecout<<sumDec<<"."<<aDec<<endl;}return 0;}



 
0 0
原创粉丝点击