大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4823 Accepted Submission(s): 1592
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
1.1 2.9 1.1111111111 2.3444323343 1 1.1
4 3.4555434454 2.1
#include<stdio.h>
#include<string.h>
int main()
{
int a[1000],b[1000],c[1000],i,j,k1,k2,d[1000],e[1000],f[1000],i1,i2,j1,flag1,flag2,i11,i12,t,flag,flag3,num;
char st1[1000],st2[1000];
while(scanf("%s%s",st1,st2)!=EOF)
{
i1=0;i2=0;
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
k1=strlen(st1);
k2=strlen(st2);
for(i=0;i<=k1-1&&st1[i]!='.';i++)
a[i]=st1[i]-'0';
i11=i;
i++;
flag1=1;
for(i1=0;i<=k1-1;i++,i1++)
{
d[i1]=st1[i]-'0';
flag1=0;
}
for(i=0;i<(i11)/2;i++)
{
t=a[i];
a[i]=a[i11-i-1];
a[i11-i-1]=t;
}
for(i=0;i<=k2-1&&st2[i]!='.';i++)
b[i]=st2[i]-'0';
i12=i;
i++;
flag2=1;
for(i2=0;i<=k2-1;i++,i2++)
{
e[i2]=st2[i]-'0';flag2=0;
}
for(i=0;i<(i12)/2;i++)
{
t=b[i];
b[i]=b[i12-i-1];
b[i12-i-1]=t;
}
for(i=0;i<=i1-1||i<=i2-1;i++)
f[i]=d[i]+e[i];
j=i;
num=j;
for(j=i;j>=1;j--)
if(f[j]>9)
{
f[j-1]+=1;
f[j]=f[j]-10;
}
i=j;
flag=0;
if(num!=0)
{
if(f[0]>9)
{f[0]=f[0]-10;flag=1;}
}
while(f[num-1]==0&&num>0)
{
num--;
}
if(flag==1) a[0]+=1;
if(flag1==0)
k1=k1-i1-1;
if(flag2==0)
k2=k2-i2-1;
for(i=0;i<=k1-1&&i<=k2-1;i++)
c[i]=a[i]+b[i];
j=i;
if(k1>k2)
for(j=i;j<=k1-1;j++)
c[j]=a[j];
else
for(j=i;j<=k2-1;j++)
c[j]=b[j];
for(i=0;i<=j-2;i++)
if(c[i]>9)
{ c[i]=c[i]-10; c[i+1]+=1;}
i=j-1;
while(c[i]==0&&i>0)
{
j--;
i--;
}
for(i=j-1;i>=0;i--)
printf("%d",c[i]);
flag3=0;
if(num==1&&f[0]==0)
flag3=1;
if(num==0)
{
flag3=1;
}
if((i1>0||i2>0)&&flag3==0)
{
printf(".");
for(i=0;i<num;i++)
printf("%d",f[i]);
}
printf("\n");
}
return 0;
}