题解 | #浮点数加法#

浮点数加法

https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8

  • 先将长短可能不一的两数对齐(补零);
  • 然后利用串行进位加法器的方法,由低位到高位逐位计算,先算小数部分再算整数部分
#include <iostream>
#include <algorithm>
using namespace std;
void alignInt(string &str,int n){
    if(str.length()==n) return;
    for(int i=n-str.length();i>0;i--) str='0'+str;
}
void alignDec(string &str,int n){
    if(str.length()==n) return;
    for(int i=n-str.length();i>0;i--) str=str+'0';
}
char add(string &a, string &b, char CarryIn){//计算结果存储在&a
    char CarryOut;
    int sum, Carry = CarryIn - '0';//此处 注意数据类型
    for(int i=a.length()-1;i>=0;i--){
        sum=int(a[i]-'0')+int(b[i]-'0')+Carry;
        Carry=sum/10;
        a[i]=sum%10+'0';
    }
    CarryOut=Carry+'0';
    return CarryOut;
}
int main() {
    string a,b,ans;
    while(cin>>a>>b){
        string aInt=a.substr(0,a.find('.'));//整数、小数分别处理
        string aDec=a.substr(a.find('.')+1);
        string bInt=b.substr(0,b.find('.'));
        string bDec=b.substr(b.find('.')+1);

        int nInt=max(aInt.size(),bInt.size());//短数向长数看齐
        int nDec=max(aDec.size(),bDec.size());
        alignInt(aInt, nInt);
        alignInt(bInt, nInt);
        alignDec(aDec, nDec);
        alignDec(bDec, nDec);

        char CinDec='0';//模拟串行进位加法器,进行计算
        char CoutDec=add(aDec,bDec,CinDec);//小数相加 向整数最低位进位
        char CoutInt=add(aInt,bInt,CoutDec);//CoutDec=CinInt
        if(CoutInt!='0') aInt=CoutInt+aInt;//判断整数最高位 是否有进位

        cout<<aInt<<'.'<<aDec<<endl;//输出结果
    }
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务