题解 | 浮点数加法

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//拆分整数与小数
void split(string & s,string & int_, string & dec_)
{
    int pos = s.find('.');
    int_ = s.substr(0,pos);
    dec_ = (pos!=string::npos) ? s.substr(pos+1) : ""; 
}

//对齐小数
void aligndec(string & s1,string & s2)
{
    if( s2.size()<s1.size() )
    {
        s2  = s2 + string(s1.size()-s2.size(),'0');
    }else {
        s1 = s1 + string(s2.size()-s1.size(),'0');
    }
}

//对齐整数
void alignint(string & s1,string & s2)
{
    if( s2.size()<s1.size() )
    {
        s2 = string(s1.size()-s2.size(),'0') + s2;
    }else{
        s1 = string(s2.size()-s1.size(),'0') + s1;
    }


}
//加法
string add(string & s1,string & s2)
{
    int n = s1.size();
    int flag = 0;
    int m;
    string s;
    for(int i=n-1; i>=0; i--)
    {
        m = (s1[i]-'0') + (s2[i]-'0') + flag;
        flag = m/10;
        s.push_back(m%10 + '0');
    }
    if(flag!=0) s.push_back(flag+'0');
    reverse(s.begin(),s.end());
    return s;
}


int main() {
    string s1,s2;
    while(cin>>s1>>s2)
    {
        string dec_1,dec_2,int_1,int_2;
        split(s1,int_1,dec_1);
        split(s2,int_2,dec_2);

        aligndec(dec_1,dec_2);
        alignint(int_1,int_2);

        string dec_=add(dec_1,dec_2);
        string int_=add(int_1,int_2);

        if(dec_.size()>dec_1.size())//有进位
        {
            string str = string(1,dec_[0]);//将进位化为string类型方便add函数
            alignint(int_, str);//整数对齐方便执行加法
            int_ = add(int_,str);
            dec_ = dec_.substr(1);//小数和中去掉进位
        }
        cout<<int_<<'.'<<dec_<<endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论
这道题绝对不是easy难度,起码有mid甚至hard,牛客刷题评价难度还是看题解的数量,题解数量多就简单,题解数量少就难,越少越难
点赞 回复 分享
发布于 02-04 19:50 山西

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务