问题 C: 浮点数加法


#include <iostream>
#include <cstdio>
#include <cstring>


using namespace std;

struct big_number {
    int d[10010], len;

    big_number() {
        memset(d, 0, sizeof(d));
        len = 0;
    }
};

big_number change(char s[]) {
    big_number ans;
    int len = strlen(s);
    ans.len = len;
    for (int i = 0; i < len; ++i) {
        ans.d[i] = s[len - i - 1] - '0';
    }
    return ans;
}

big_number b_plus(const big_number &a, const big_number &b, int &carry) {

    big_number ans;
    for (int i = 0; i < a.len || i < b.len; ++i) {
        int temp = a.d[i] + b.d[i] + carry;
        carry = temp / 10;
        ans.d[ans.len++] = temp % 10;
    }
    if (carry != 0) ans.d[ans.len++] = carry;

    return ans;

}

big_number b_plus2(const big_number &a, const big_number &b, int &carry) {

    big_number ans;
    for (int i = 0; i < a.len || i < b.len; ++i) {
        int temp = a.d[i] + b.d[i] + carry;
        carry = temp / 10;
        ans.d[ans.len++] = temp % 10;
    }
    return ans;

}

big_number b_multi(const big_number &a, const int &b) {
    big_number ans;

    long long carry = 0;

    int len = a.len;
    for (int i = 0; i < len; ++i) {
        long long temp = a.d[i] * b + carry;
        ans.d[ans.len++] = (temp % 10);
        carry = temp / 10;
    }
    while (carry != 0) {
        ans.d[ans.len++] = carry % 10;
        carry = carry / 10;
    }

    return ans;
}

void split(char *a1, char *a2) {

    int n = strlen(a1);
    bool flag = false;
    int j = 0;
    for (int i = 0; i < n; ++i) {

        if (flag) {
            a2[j++] = a1[i];
            continue;
        }
        if (a1[i] == '.') {
            flag = true;
            a1[i] = '\0';
        }
    }
    a2[j] = '\0';
}

void trim(char *a1, char *a2) {
    int n1, n2;
    char *t1, *t2;
    bool flag = false;
    n1 = strlen(a1);
    n2 = strlen(a2);
    if (n1 == n2) return;
    if (n2 > n1) {
        flag = true;
        t1 = a2;
        t2 = a1;
        swap(n1, n2);
    } else {
        t1 = a1;
        t2 = a2;
    }
    int s = n1 - n2;
    t2[n1] = '\0';

    for (int j = n2; j < n1; ++j) {
        t2[j] = '0';
    }

    if (flag) {
        a1 = t2;
        a2 = t1;
    } else {
        a1 = t1;
        a2 = t2;
    }
}

void fix(big_number &a) {
    while (a.d[0] == 0) {
        for (int i = 0; i < a.len-1; ++i) {
            a.d[i] =a.d[i+1];
        }
        a.len--;
    }
}

int main() {

    int n;

    while (scanf("%d", &n) != EOF) {

        for (int i = 0; i < n; ++i) {
            char a1[101], a2[101], b1[101], b2[101];
            scanf("%s %s", a1, b1);

            split(a1, a2);
            split(b1, b2);

            trim(a2, b2);

            big_number f, e;
            int carry = 0;
            e = b_plus2(change(a2), change(b2), carry);
            f = b_plus(change(a1), change(b1), carry);

            fix(e);


            //out
            for (int j = f.len - 1; j >= 0; --j) {
                printf("%d", f.d[j]);
            }

            printf(".");
            for (int k = e.len - 1; k >= 0; --k) {
                printf("%d", e.d[k]);
            }
            printf("\n");

        }


    }

    return 0;
}

posted @ 2020-02-29 22:29  ailinal  阅读(176)  评论(0)    收藏  举报