计算机考研真题 浮点数加法

题目描述

求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
*/
原文地址:https://www.cnblogs.com/parzulpan/p/10014025.html