hdu1753 2010.3.6
小数高精度
大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1403 Accepted Submission(s): 418
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1
Author
linle
Source
2007省赛集训队练习赛(6)_linle专场
Recommend
lcy
#define MAX 1000
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[MAX],b[MAX],at[MAX],bt[MAX],c[MAX];
int la,lb,pa,pb,i,t,ex,h,k;
la=lb=0;
while (scanf("%s %s",a,b)!=EOF)
{
la=strlen(a);
lb=strlen(b);
for (pa=0;pa<la;pa++)
if (a[pa]=='.') break;
if (pa>=la) pa=la-1;
for (pb=0;pb<lb;pb++)
if (b[pb]=='.') break;
if (pb>=lb) pb=lb-1;
memset(at,0,sizeof(at));
memset(bt,0,sizeof(bt));
if (la-pa > lb-pb)
{
k=la-pa-2;
t=0;
for (i=la-1;i>=0;i--)
{
if (a[i]!='.')
{
at[t]=a[i]-48;
t++;
}
}
t=la-pa-lb+pb;
for (i=lb-1;i>=0;i--)
{
if (b[i]!='.')
{
bt[t]=b[i]-48;
t++;
}
}
}
else
{
k=lb-pb-2;
t=0;
for (i=lb-1;i>=0;i--)
{
if (b[i]!='.')
{
bt[t]=b[i]-48;
t++;
}
}
t=lb-pb-la+pa;
for (i=la-1;i>=0;i--)
{
if (a[i]!='.')
{
at[t]=a[i]-48;
t++;
}
}
}
t=0;
memset(c,0,sizeof(c));
for (i=0;i<MAX;i++)
{
t=t+at[i]+bt[i];
c[i]=t%10;
t=t/10;
}
for (ex=0;ex<MAX;ex++)
if (c[ex]!=0) break;
for (h=MAX-1;h>=0;h--)
if (c[h]!=0) break;
if (ex>h)
printf("0\n");
else
{
if (ex>k)
{
for (i=h;i>k;i--)
printf("%d",c[i]);
printf("\n");
}
else
{
for (i=h;i>k;i--)
printf("%d",c[i]);
printf(".");
for (i=k;i>=ex;i--)
printf("%d",c[i]);
printf("\n");
}
}
}
return 0;
}