问题 C: 浮点数加法

题目描述
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj
对于整数部分,P1P2…Pi是一个非负整数
对于小数部分,Qj不等于0

输入
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符

输出
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数

样例输入

2
3.756
90.564

4543.5435
43.25

样例输出

94.32
4586.7935

思路:使用string直接模拟加法过程,先对齐小数点和补充0使得两个浮点数长短一样,然后从最低位到最高位进行模拟,遇到小数点时直接跳过,最后记得去除后缀0。
例如:4543.5435+43.25,先找到小数点,补充前缀0和后缀0使其对齐,再模拟加法过程。

  4543.5435
  0043.2500
#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    scanf("%d", &n);
    string num1, num2;
    while (n--) {
        getchar(); //吸收换行符
        getline(cin, num1);
        getline(cin, num2);
        int pos1 = num1.find('.'), pos2 = num2.find('.'); //找到小数点位置
        if (pos1 > pos2) { //对齐两个数的小数点,补充前缀0
            num2.insert(0, pos1 - pos2, '0');
        } else {
            num1.insert(0, pos2 - pos1, '0');
        }
        if (num1.length() > num2.length()) { //补充后缀0
            num2.insert(num2.length(), num1.length() - num2.length(), '0');
        } else {
            num1.insert(num1.length(), num2.length() - num1.length(), '0');
        }
        int carry = 0; //进位
        for (int i = num1.length() - 1; i >= 0; i--) { //把最终结果存储在num1
            if (num1[i] == '.') continue; //跳过小数点
            num1[i] += num2[i] - '0' + carry; //对应位相加
            carry = (num1[i] - '0') / 10; //得到进位
            num1[i] = (num1[i] - '0') % 10 + '0'; //个位数为该位结果
        }
        if (carry) num1.insert(0, 1, '1'); //如果最后进位不为0,最高位为1
        for (int i = num1.length() - 1; i >= 0; i--) {
            if (num1[i] != '0') break; //遇到第一个不为0的数停止
            if (num1[i] == '0') num1.erase(i, 1); //去除后缀0
        }
        cout << num1 << endl;
    }
    return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值