您的位置:首页 > 其它

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

2015-10-24 12:04 399 查看
时间限制: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
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: