题目描述
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj 对于整数部分,P1P2...Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数
示例1
输入
123.111111111111111111111111111111 79.911111111111111111111111111111
输出
203.022222222222222222222222222222
//计算机考研真题 浮点数加法 /* 程序设计思想: 大体构思:这道题和我之前那道a+b(大数加法)类似,可以把整数部分和小数部分分开求解。 具体步骤:把整数部分和小数部分对齐,对齐就是使两浮点数字符串一样长,且小数点在相同的位置。 1、从结尾开始每位相加 2、遇到‘.’,就加入“.”到结果字符串中 3、最高位有进位,要再进一位 4、输出结果字符串 */ //程序实现: #include <iostream> using namespace std; string addBigfloat(string sa, string sb) { string result, sc, sd; //面是将两浮点数对齐 int ia = sa.find(".", 0); //寻找小数点位置 int ib = sb.find(".", 0); sc = (ia>ib)?sa:sb; //整数部分长的 sd = (ia>ib)?sb:sa; //整数部分短的 int n = (ia>ib)?(ia-ib):(ib-ia); //整数部分长度的差值 while(n--) { sd = "0"+sd; } int lenc = sc.length(); int lend = sd.length(); sa = (lenc>lend)?sc:sd; sb = (lenc>lend)?sd:sc; n = (lenc>lend)?(lenc-lend):(lend-lenc); //小数部分长度的差值 while(n--) { sb+="0"; } //下面是对对齐后的浮点数进行相加 int carry = 0; for(int i = sa.length()-1; i>=0; i--) { if(sa[i]=='.') //遇到‘.’,就加入“.”到结果字符串中 { result = "."+result; continue; } char value = sa[i]-'0'+sb[i]-'0'+carry; //保存两数之和结果 result = char(value%10+'0')+result; //将结果加入到结果字符串中 carry = value/10; //计算进位 } while(carry!=0) //若还有进位 { result = char(carry%10+'0')+result; carry/=10; } return result; } int main() { string sa, sb; while(cin>>sa>>sb) { cout<<addBigfloat(sa, sb)<<endl; } return 0; } /* 程序总结: 对齐就是使两浮点数字符串一样长,且小数点在相同的位置,如 4441976058474520796.650571 9057183.9521 对齐之后是: 4441976058474520796.650571 0000000000009057183.952100 */