九度OJ 1137:浮点数加法 (大数运算)
- 题目描述:
- 
求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 
思路:
容易犯细节错误,此题我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
****************************************************************/
    编程算法爱好者。
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号