大明A+B
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 44 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1
Author
Source
#include<stdio.h>
#include<string.h>
#define N 500
int main()
{
int n,m,i,j,c[N],d[N],e[N],f[N],x[N],y[N],t,k,s,p,q;
char a[N],b[N];
while(scanf("%s %s",a,b)!=EOF)
{
memset(c,0,sizeof(c)); //初始化
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
memset(f,0,sizeof(f));
t=m=strlen(a);
k=n=strlen(b);
for(i=0;i<m;i++) //找第一个数据的小数点,将小数点的位置
{
if(a[i]=='.')
t=i;
}
for(i=0;i<n;i++) ////找第=个数据的小数点,将小数点的位置
{
if(b[i]=='.')
k=i;
}
for(i=0,j=t-1;i<t;i++)
{ c[i]=a[j]-'0';j--;}
for(i=0,j=k-1;i<k;i++)
{ d[i]=b[j]-'0';j--;}
for(i=t+1,j=0;i<m;i++)
{ e[j]=a[i]-'0';j++;}
for(i=k+1,j=0;i<n;i++)
{ f[j]=b[i]-'0';j++;}
j=q=0;
if((m-t)<(n-k))
j=n-k;
else
j=m-t;
for(i=j-1,p=0;i>=0;i--)
{
x[i]=(e[i]+f[i]+p)%10;
if(e[i]+f[i]+p>9)
p=(e[i]+f[i]+p)/10;
else
p=0;
}
if(t<k)
q=k;
else
q=t;
for(i=0;i<=q;i++)
{
y[i]=(c[i]+d[i]+p)%10;
if(c[i]+d[i]+p>9)
p=(c[i]+d[i]+p)/10;
else
p=0;
}
if(y[q]>0) //考虑进位
q=q+1;
for(i=q-1;i>=0;i--)
printf("%d",y[i]);
while(x[j-1]==0) //消除0
{
if(x[j-1]==0)
j=j-1;
}
if(j>0)
printf(".");
for(i=0;i<j;i++)
printf("%d",x[i]);
printf("
");
}
return 0;
}