蓝桥杯 ADV-18 算法提高 实数相加

栏目: 编程工具 · 发布时间: 6年前

内容简介:问题描述输入格式两行字符串,每行都是一个合法的实数。合法的意思是指:整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.

问题描述

计算两个实数相加的结果。

输入格式

两行字符串,每行都是一个合法的实数。合法的意思是指:整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.

输出格式

相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.

样例输入

分析:1.高精度模拟竖式加法,整数部分相加,小数部分相加

2.整数部分,位数不够,前面补0;小数部分位数不够,后面补0

3.小数部分如果有进位,要截下来加到整数上去~

#include <iostream>
#include <string>
using namespace std;
string add1(string s1, string s2) {
    int len1 = s1.length(), len2 = s2.length();
    if (len1 < len2) {
        string t(len2 - len1, '0');
        s1 = t + s1;
    } else if (len2 < len1) {
        string t(len1 - len2, '0');
        s2 = t + s2;
    }
    string ans = s1;
    int car = 0;
    for (int i = s1.length() - 1; i >= 0; i--) {
        ans[i] = (s1[i] - '0' + s2[i] - '0' + car) % 10 + '0';
        car = (s1[i] - '0' + s2[i] - '0' + car) / 10;
    }
    if (car) ans = (char) (car + '0') + ans;
    return ans;
}
string add2(string s1, string s2) {
    int len1 = s1.length(), len2 = s2.length();
    if (len1 < len2) {
        string t(len2 - len1, '0');
        s1 = s1 + t;
    } else if (len2 < len1) {
        string t(len1 - len2, '0');
        s2 = s2 + t;
    }
    string ans = s1;
    int car = 0;
    for (int i = s1.length() - 1; i >= 0; i--) {
        ans[i] = (s1[i] - '0' + s2[i] - '0' + car) % 10 + '0';
        car = (s1[i] - '0' + s2[i] - '0' + car) / 10;
    }
    if (car) ans = (char) (car + '0') + ans;
    return ans;
}
int main() {
    string a, b;
    while (cin >> a >> b) {
        string a1, a2, b1, b2;
        int i, j;
        for (i = 0; i < a.length() && a[i] != '.'; i++);
        for (j = 0; j < b.length() && b[j] != '.'; j++);
        a1 = a.substr(0, i);
        b1 = b.substr(0, j);
 
        if (i == a.length()) a2 = "";
        else a2 = a.substr(i + 1, a.length() - i - 1);
        if (j == b.length())b2 = "";
        else b2 = b.substr(j + 1, b.length() - j - 1);
 
        string ans1 = add1(a1, b1);
        string ans2 = add2(a2, b2);
 
        if (ans2.length() > max(a2.length(), b2.length())) {
            ans2 = ans2.substr(1, ans2.length() - 1);
            ans1 = add1(ans1, "1");
        }
        if (ans2.length() > 0) ans2 = "." + ans2;
        cout << ans1 << ans2 << endl;
    }
    return 0;
}
❤❤点击这里 -> 订阅PAT、蓝桥杯、GPLT天梯赛、LeetCode题解离线版❤❤ 蓝桥杯 ADV-18 算法提高 实数相加

以上所述就是小编给大家介绍的《蓝桥杯 ADV-18 算法提高 实数相加》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

操作系统基础教程

操作系统基础教程

戴维斯 / 第1版 (2006年7月1日) / 2006-7 / 34.0

这是一本关于操作系统基本原理的教科书,其最大特点就是从操作系统的分层概念出发,深入浅出地介绍了操作系统的基本概念和基本框架。本书可以作为高等院校非计算机专业相关课程的教材或参考书,也适合具有高中以上数学基础的计算机用户自学,还可以作为社会上计算机培训机构的教材。对所有想了解计算机操作系统,但又不需要或不打算深入学习其理论和实现细节的读者来说,本书是一本极具价值的入门指导书。一起来看看 《操作系统基础教程》 这本书的介绍吧!

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具