话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
这一题不难但是我写的时候错的太多了,
1,小数点后的位数不能增加,我第二次写的时候让他们正着加了,并且按最大的长度赋了初值0.
2.我第一次判断该不该加小数点,看的是小数点后的数字为0是否为0,后来才改成看加过后小数点的长度。
#include<stdio.h>
#include<string.h>
char s1[10010],s2[10010];
int a[10010],b[10010],c[10010],d[10010],sum1[10010],sum2[10010];
int b1[10010],d1[10010];
int main()
{
while(~scanf("%s%s",s1,s2))
{
int ls1=strlen(s1);
int ls2=strlen(s2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
int la=ls1,lb=0,lc=ls2,ld=0;
for(int i=0;i<ls1;i++)
{
if(s1[i]=='.')
{
la=i;
lb=ls1-i-1;
}
}
for(int i=0;i<ls2;i++)
{
if(s2[i]=='.')
{
lc=i;
ld=ls2-i-1;
}
}
int e,r,ee=-1;
r=(la>lc)?la:lc;
e=(lb>ld)?lb:ld;
for(int i=0;i<e;i++)
{
b[i]=0;
d[i]=0;
}
for(int i=la-1,j=0;i>=0;i--)
{
a[j++]=s1[i]-'0';
}
for(int i=la+1,j=0;i<ls1;i++)
{
b[j++]=s1[i]-'0';
}
for(int i=lc-1,j=0;i>=0;i--)
{
c[j++]=s2[i]-'0';
}
for(int i=lc+1,j=0;i<ls2;i++)
{
d[j++]=s2[i]-'0';
}
int bb=0;
for(int i=e-1;i>=0;i--)
{
sum1[i]=b[i]+d[i]+bb;
bb=0;
if(sum1[i]>=10&&i!=0)
{
bb=1;
sum1[i]=sum1[i]-10;
}
}
if(sum1[0]>=10)
{
sum2[0]=1;
sum1[0]=sum1[0]-10;
}
for(int i=0;i<r;i++)
{
sum2[i]+=a[i]+c[i];
if(sum2[i]>=10)
{
sum2[i+1]=1;
sum2[i]=sum2[i]-10;
}
}
for(int i=e-1;i>=0;i--)
{
if(sum1[i]!=0)
{
ee=i;
break;
}
}
if(sum2[r]==1)
printf("1");
for(int i=r-1;i>=0;i--)
printf("%d",sum2[i]);
if(ee>=0)
{
printf(".");
for(int i=0;i<=ee;i++)
printf("%d",sum1[i]);
}
printf("\n");
}
return 0;
}