九度OJ 1137:浮点数加法 (大数运算)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2725

解决:736

题目描述:

求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
来源:
2008年北京大学软件所计算机研究生机试真题

思路:

容易犯细节错误,此题我WA了好几次。


代码:

#include <stdio.h>
#include <string.h>
char s1[110], s2[110], s[110];
int Find(char a[], int n)
{
        int i;
        for (i = 0; a[i]; i++)
        {
                if (a[i] == '.')
                {
                        return i;
                }
        }
        return -1;
}
int main()
{
        int ca;
        scanf("%d", &ca);
        while (ca--)
        {
                scanf("%s%s", s1, s2);
                int n1 = strlen(s1);
                int n2 = strlen(s2);
                int pos1 = 0, pos2 = 0;
                pos1 = Find(s1, n1);
                pos2 = Find(s2, n2);
                int i = n1, j = n2;
                int d = (n1 - pos1) - (n2 - pos2);
                if (d > 0)
                {
                        for (; j < n2 + d; j++)
                        {
                                s2[j] = '0';
                        }
                        s2[j] = '\0';
                        n2 = j;
                }
                else if (d < 0)
                {
                        for (; i < n1 - d; i++)
                        {
                                s1[i] = '0';
                        }
                        s1[i] = '\0';
                        n1 = i;
                }
                i--;
                j--;
                int t = 0, len = 0;
                while (i >= 0 && j >= 0)
                {
                        if(s1[i] == '.')
                        {
                                s[len] = '.';
                        }
                        else
                        {
                                t += s1[i] + s2[j] - 2 * '0';
                                s[len] = t % 10 + '0';
                                t /= 10;
                        }
                        len++;
                        i--;
                        j--;
                }
                while (i >= 0)
                {
                        t += s1[i--] - '0';
                        s[len++] = t % 10 + '0';
                        t /= 10;
                }
                while (j >= 0)
                {
                        t += s2[j--] - '0';
                        s[len++] = t % 10 + '0';
                        t /= 10;
                }
                if (t == 1)
                {
                        s[len++] = '1';
                }
                j = 0;
                while (s[j] == '0')
                {
                        j++;
                }
                for (i = len - 1; i >= j; i--)
                {
                        printf("%c", s[i]);
                }
                printf("\n");
        }
        return 0;
}
/**************************************************************
    Problem: 1137
    User: liangrx06
    Language: C
    Result: Accepted
    Time:150 ms
    Memory:912 kb
****************************************************************/


你可能感兴趣的:(C语言,大数运算,OJ,九度)