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