题解 | #浮点数加法#

浮点数加法

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

#include <iostream>
using namespace std;

string f_plus(string s1, string s2)
{
    //ans1是小数部分, ans2整数部分
    string ans1, ans2;
    //是否进位,整数小数通用
    bool ad = false;
    //进行小数点对齐
    int idx1, idx2;
    for(int i = 0; s1[i]; i++)
        if(s1[i] == '.') idx1 = i;
    for(int i = 0; s1[i]; i++)
        if(s2[i] == '.') idx2 = i;

    int i = s1.size() - idx1 - 1, j = s2.size() - idx2 - 1;
    int cnt1 = 1, cnt2 = 1;
    //小数部分加减
    while(i && j)
    {
        if(i > j) 
        {
            ans1 += s1[s1.size() - cnt1++];
            i--;
        }
        else if(i < j)
        {
            ans1 += s2[s2.size() - cnt2++];
            j--;
        }
        else 
        {
            int x = s1[s1.size() - cnt1++] - '0', y = s2[s2.size() - cnt2++] - '0';
            int sum = x + y + ad;
            ans1 += (sum % 10) + 48;
            if(sum / 10) ad = true;
            else ad = false;
            i--,j--;
        }
    }
    //小数部分进行倒置得到小数部分答案
    for(int i = 0; i < ans1.size() / 2; i++)
    {
        char t = ans1[i];
        ans1[i] = ans1[ans1.size() - (i + 1)];
        ans1[ans1.size() - (i + 1)] = t;
    }

    //进行小数点对齐
    i = idx1 - 1, j = idx2 - 1;
    //整数部分加减
    while(i >= 0 && j >= 0)
    {
        int x = s1[i] - '0', y = s2[j] - '0';
        int sum = x + y + ad;
        ans2 += (sum % 10) + 48;
        if(sum / 10) ad = true;
        else ad = false;
        i--,j--;
    }
    while(i >= 0)
    {
        int x = s1[i] - '0' + ad;
        ans2 += (x % 10) + 48;
        if(x / 10) ad = true;
        else ad = false;
        i--;
    }
    while(j >= 0)
    {
        int x = s2[j] - '0' + ad;
        ans2 += (x % 10) + 48;
        if(x / 10) ad = true;
        else ad = false;
        j--;
    }
    //整数部分进行倒置得到小数部分答案
    for(int i = 0; i < ans2.size() / 2; i++)
    {
        char t = ans2[i];
        ans2[i] = ans2[ans2.size() - (i + 1)];
        ans2[ans2.size() - (i + 1)] = t;
    }

    return ans2 + "." + ans1;
}

int main() {
    string s1, s2;

    while(cin >> s1 >> s2)
    {
        cout << f_plus(s1, s2) << endl;
    }
    
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务