浮点数加法 九度oj

题目

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

10000000.655555555555555555555555555555
1.444444444444444444444444444445
样例输出:
0.222222222222222222222222222222
10000002.1

思路

这道题本来考察的应该是大整数加法,但是太多细节需要注意了,我提示几点:
  1. 细心,分解整数部分和小数部分,分别相加,注意大整数加法的进位
  2. 注意一个测试用例,0.0+0.0应该=0.0
  3. 注意对整数部分开始0的截断,和小数部分最后0的截断

AC代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define LEN 101
 
int ia[LEN], fa[LEN], ib[LEN], fb[LEN], ic[LEN], fc[LEN];
 
int main()
{
    char str1[LEN], str2[LEN];
    int i, j, k, n, l1, l2, lai, laf, lbi, lbf, temp, flmax, ilmax;
 
    while (scanf("%d", &n) != EOF) {
        while (n --) {
            // 初始化
            memset(ia, 0, sizeof(ia));
            memset(fa, 0, sizeof(fa));
            memset(ib, 0, sizeof(ib));
            memset(fb, 0, sizeof(fb));
            memset(ic, 0, sizeof(ic));
            memset(fc, 0, sizeof(fc));
 
            // 接收第一个浮点数
            scanf("%s", str1);
            l1 = strlen(str1);
 
            // 构建整数部分数组
            for (i = 0; i < l1 && str1[i] != '.'; i ++) {
                ia[i] = str1[i] - '0';
            }
            lai = i;
 
            // 数位替换
            for (j = 0, k = lai - 1; j <= lai / 2 && j < k; j ++, k --) {
                temp = ia[j];
                ia[j] = ia[k];
                ia[k] = temp;
            }
 
            // 构建小数部分数组
            for (i += 1; i < l1; i ++) {
                fa[i - 1 - lai] = str1[i] - '0';
            }
            laf = i - 1 - lai;
 
 
            // 接收第二个浮点数
            scanf("%s", str2);
            l2 = strlen(str2);
 
            // 构建整数部分数组
            for (i = 0; i < l2 && str2[i] != '.'; i ++) {
                ib[i] = str2[i] - '0';
            }
            lbi = i;
 
            // 数位替换
            for (j = 0, k = lbi - 1; j <= lbi / 2 && j < k; j ++, k --) {
                temp = ib[j];
                ib[j] = ib[k];
                ib[k] = temp;
            }
 
            // 构建小数部分数组
            for (i += 1; i < l2; i ++) {
                fb[i - 1 - lbi] = str2[i] - '0';
            }
            lbf = i - 1 - lbi;
 
            // 谁的小数位数更多
            flmax = (laf >= lbf) ? laf : lbf;
            int c = 0;  //小数进位
            for (i = 0, j = flmax - 1; j >= 0; j --, i ++) {
                fc[i] = fa[j] + fb[j] + c;
                if (fc[i] >= 10) {
                    c = fc[i] / 10;
                    fc[i] %= 10;
                }else {
                    c = 0;
                }
            }
 
            // 整数相加
            ilmax = (lai >= lbi) ? lai : lbi;
            for (i = 0; i < ilmax; i ++) {
                ic[i] = ia[i] + ib[i] + c;
                if (ic[i] >= 10) {
                    c = ic[i] / 10;
                    ic[i] %= 10;
                }else {
                    c = 0;
                }
            }
            while (c) {
                ic[ilmax ++] = c % 10;
                c /= 10;
            }
 
 
            // 打印最后结果
 
            // 找到第一个不为0的整数位
            for (j = ilmax - 1; j >= 0; j --) {
                if (ic[j] != 0) {
                    break;
                }
            }
            if (j >= 0) {
                for (i = j; i >= 0; i --) {
                    printf("%d", ic[i]);
                }
            }else {
                printf("0");
            }
            printf(".");
 
            // 找到最后一个不为0的小数位
            for (j = 0; j < flmax - 1; j ++) {
                if (fc[j] != 0) {
                    break;
                }
            }
            for (i = flmax - 1; i >= j; i --) {
                printf("%d", fc[i]);
            }
            printf("\n");
 
            // 接收空行
            getchar();
        }
 
    }
 
    return 0;
}
/**************************************************************
    Problem: 1137
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:290 ms
    Memory:912 kb
****************************************************************/


posted @ 2013-03-19 16:21  java程序员填空  阅读(181)  评论(0编辑  收藏  举报