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

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

题目:
求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;

    }
}

猜你喜欢

转载自blog.csdn.net/Void_worker/article/details/81517502