您的位置:首页 > 其它

hdoj-1753-大明A+B(大数)

2015-07-29 10:13 302 查看

大明A+B

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 10109 Accepted Submission(s): 3630

[align=left]Problem Description[/align]
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。

这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

[align=left]Input[/align]
本题目包含多组测试数据,请处理到文件结束。

每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

[align=left]Output[/align]
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

[align=left]Sample Input[/align]

1.1 2.9
1.1111111111 2.3444323343
1 1.1


[align=left]Sample Output[/align]

4
3.4555434454
2.1


解题思路:
这是用大数来解决小数加减。
将给定的数据分为整数和小数部分,整数逆着存到一个数组(从0开始),小数正着存到一个数组(从1开始)。
先进行小数运算,逆着运算;然后将小数[0]加到整数[0],然后整数运算,正着运算。
然后清除整数数组后面多余的0,逆着输出,清除小数后面的0,并判断是否到0,否则输出小数点,且小数数组正着输出。
代码:
#include<stdio.h>
#include<string.h>
char a[410],b[410];
int za[410],zb[410];
int xa[410],xb[410];
int ze[410],xe[410];
int main()
{
int lena,lenb;
int poa,pob;
int now;
int i,j,k;
int lxa,lxb;
while(scanf("%s%s",a,b)!=EOF)
{
lena=strlen(a);
lenb=strlen(b);
for(i=0;i<lena&&a[i]!='.';i++)
{
}
poa=i;
for(i=0;i<lenb&&b[i]!='.';i++)
{
}
pob=i;
//找小数点
memset(za,0,sizeof(za));
memset(zb,0,sizeof(zb));
memset(xa,0,sizeof(xa));
memset(xb,0,sizeof(xb));
//清空临时存储数组
for(i=poa-1,j=0;i>=0;i--,j++)
za[j]=a[i]-'0';
for(i=pob-1,j=0;i>=0;i--,j++)
zb[j]=b[i]-'0';
//整数逆着存储
for(i=poa+1,j=1;i<lena;i++,j++)
xa[j]=a[i]-'0';
lxa=j-1;
for(i=pob+1,j=1;i<lenb;i++,j++)
xb[j]=b[i]-'0';//注意j从1开始
lxb=j-1;
//小数正着存储
if(lxa<lxb)
{
lxa=lxb;
}//找长的
memset(xe,0,sizeof(xe));
for(i=lxa;i>=0;i--)
{
xe[i]+=xa[i]+xb[i];
if(xe[i]>9)
{
xe[i-1]+=xe[i]/10;
xe[i]%=10;
}
}
//小数逆着运算
if(poa<pob)
{
poa=pob;
}
memset(ze,0,sizeof(ze));
if(xe[0]!=0)
ze[0]+=xe[0];//小数[0]加到整数[0]
for(i=0;i<=poa;i++)
{
ze[i]+=za[i]+zb[i];
if(ze[i]>9)
{
ze[i+1]+=ze[i]/10;
ze[i]%=10;
}
}
//整数正着运算
for(i=poa;i>=0&&ze[i]==0;i--)
{
}
for(;i>=0;i--)
printf("%d",ze[i]);

for(i=lxa;i>0;i--)
if(xe[i]!=0)
break;
if(i!=0)
{
j=i;
printf(".");
for(j=1;j<=i;j++)
printf("%d",xe[j]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: