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

来源:互联网 发布:nodejs python 前景 编辑:程序博客网 时间:2024/06/01 10:45

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2725

解决:736

题目描述:

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

输入:

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

输出:

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

样例输入:
20.1111111111111111111111111111110.11111111111111111111111111111110000000.6555555555555555555555555555551.444444444444444444444444444445
样例输出:
0.22222222222222222222222222222210000002.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****************************************************************/


0 0
原创粉丝点击