考研机试真题--浮点数加法--北京大学

该博客介绍了如何处理考研机试中浮点数加法问题,通过将浮点数转化为字符串并进行大整数加法来求解。题目规定输入输出的浮点数具有特定格式,且输出保证小数部分不为零。示例展示了两个相同浮点数相加的结果。链接提供了题目详情和在线练习平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字:浮点数加法,可以用字符串处理一下,转换成大整数加法

题目:
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
示例1
输入
0.111111111111111111111111111111
0.111111111111111111111111111111
输出
0.222222222222222222222222222222

链接:
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8?tpId=40&tqId=21410&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
const int maxn = 1010;


int main(){
//    freopen("a.txt", "r", stdin);
    string s1, s2;
    int i, j;
    while(cin >> s1 >> s2){
        int d1[maxn] = {0}, d2[maxn] = {0}, f1[maxn] = {0}, f2[maxn] = {0}, sumf[maxn] = {0}, sumd[maxn] = {0}, tmp[maxn] = {0};
        int len1 = s1.length(), len2 = s2.length();
        int d1cnt = 0, d2cnt = 0, f1cnt = 0, f2cnt = 0;

        for(i = 0; i < len1; ++i){
            if(s1[i] == '.') break;
            tmp[d1cnt++] = s1[i] - '0';
        }
        for(j = 0; j < i; ++j){
            d1[j] = tmp[d1cnt - 1 - j];
        }
        for(++i; i < len1; ++i){
            f1[f1cnt++] = s1[i] - '0';
        }


        for(i = 0; i < len2; ++i){
            if(s2[i] == '.') break;
            tmp[d2cnt++] = s2[i] - '0';
        }
        for(j = 0; j < i; ++j){
            d2[j] = tmp[d2cnt - 1 - j];
        }
        for(++i; i < len2; ++i){
            f2[f2cnt++] = s2[i] - '0';
        }

//        计算小数部分
        int maxL2 = max(f1cnt, f2cnt);
        int carry = 0;
        for(i = maxL2 - 1; i >= 0; --i){
            sumf[i] = (carry + f1[i] + f2[i]) % 10;
            carry = (carry + f1[i] + f2[i]) / 10;
        }

//        计算整数部分
        int maxL1 = max(d1cnt, d2cnt);
        for(i = 0; i < maxL1; ++i){
            sumd[i] = (carry + d1[i] + d2[i]) % 10;
            carry = (carry + d1[i] + d2[i]) / 10;
        }
        if(carry > 0){
            sumd[maxL1++] = carry;
        }
        for(i = maxL1 - 1; i >= 0; --i){
            cout << sumd[i];
        }
        cout << ".";
        for(i = 0; i < maxL2; ++i){
            cout << sumf[i];
        }
        cout << endl;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值