浮点数加法

#include<stdio.h>
#include<string.h>

char input[2][1000];
int n;
char point1[1000], point2[1000];
char int1[1000], int2[1000];

int pointAns[1000];
int intAns[1000];
bool pointCarry;



int fooPoint(char *a, char *b) {

    char temp[1000];

    int length_a = strlen(a);
    int length_b = strlen(b);

    if(length_b > length_a) {
        strcpy(temp, b);
        strcpy(b, a);
        strcpy(a, temp);
        length_a = strlen(a);
        length_b = strlen(b);
    }

    for(int i = 0 ; i < length_b ; i ++) {
        pointAns[i] = (b[i] - '0') + (a[i] - '0');
    }
    for(int i = length_b ; i < length_a ; i ++) {
        pointAns[i] = a[i] - '0';
    }

    for(int i = length_a - 1 ; i >= 1 ; i --) {
        if(pointAns[i] > 9) {
            pointAns[i] -= 10;
            pointAns[i - 1] ++;
        }
    }
    if(pointAns[0] > 9) {
        pointCarry = true;
        pointAns[0] -= 10;
    }

    return length_a;

}

int fooInt(char *a, char *b) {

    char temp[1000];

    int length_a = strlen(a);
    int length_b = strlen(b);

    strrev(a);
    strrev(b);

    if(length_b > length_a) {
        strcpy(temp, b);
        strcpy(b, a);
        strcpy(a, temp);
        length_a = strlen(a);
        length_b = strlen(b);
    }


    for(int i = 0 ; i < length_b ; i ++) {
        intAns[i] = (b[i] - '0') + (a[i] - '0');
    }
    for(int i = length_b ; i < length_a ; i ++) {
        intAns[i] = a[i] - '0';
    }

    if(pointCarry) {
        intAns[0] ++;
    }

    for(int i = 0 ; i < length_a - 1 ; i ++) {
        if(intAns[i] > 9) {
            intAns[i] -= 10;
            intAns[i + 1] ++;
        }
    }

    if(intAns[length_a - 1] > 9) {
        if(length_a - 1 == 0) {

        }
        else if(intAns[length_a - 1] == 10) intAns[length_a - 1] = 10;
        else intAns[length_a - 1] = (intAns[length_a - 1] % 10) * 10 + intAns[length_a - 1] / 10;
    }

    return length_a;
}

int main() {
    while(~scanf("%d", &n)) {
        while(n --) {

            pointCarry = false;
            scanf("%s", input[0]);
            scanf("%s", input[1]);
            sscanf(input[0], "%[0-9].%[0-9]", int1, point1);
            sscanf(input[1], "%[0-9].%[0-9]", int2, point2);

            int la = fooPoint(point1, point2);
            int lb = fooInt(int1, int2);

            for(int i = la - 1 ; i >= 0 ; i --) {
                if(pointAns[i] == 0) {
                    la --;
                }else {
                    break;
                }
            }

            for(int i = lb - 1 ; i >= 0 ; i --) {
                printf("%d", intAns[i]);
            }
            if(la != 0)
            printf(".");
            for(int i = 0 ; i < la ; i ++) {
                printf("%d", pointAns[i]);
            }

            printf("\n");
        }


    }

    return 0;
}



9111 浮点数加法

Time Limit:1000MS  Memory Limit:65536K
Total Submit:259 Accepted:0

Description

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

Input

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

Output

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

Sample Input

10
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445

0.11111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.4444444444445

0.11111111111111111111111111999999999999991111
0.1111119999999999999111111111111111111111111

10000000.65555555555999999999999995555555555555555555
999999999991.444444444444444444444444444445

909999999999.111111111111111111111111111111
0.111111111111111111111111111111

10000000.65555555555999999999995555555555555555555
1.444444444444444444444444444445

0.111111111111111111111111111111
0.11111111111111111111119999999911111111

10000000.655555555555555555555555555555
999999999999999999991.444444444444444444444444444445


Sample Output

0.222222222222222222222222222222
10000002.1
0.222222222222222221111111111111
10000002.100000000000055555555555555555
0.22222311111111111102222223111111111111102221
1000009999992.10000000000444444444444440000055555555555555
909999999999.222222222222222222222222222222
10000002.10000000000444444444440000000055555555555
0.22222222222222222222231111111011111111
1000000000000009999992.1





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值