话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
/*
这道题其实思路很简单就是整数部分加整数部分,小数部分加小数部分。
先找到小数点
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
char b1[405],a1[405];
char a[405],b[405];
char s1[405],s2[405];
int ans[405],ans1[405];
while(~scanf("%s %s",s1,s2))
{
int flag=0;
int t=0;
memset(a1,'\0',sizeof(a1));
memset(b1,'\0',sizeof(b1));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<strlen(s1);i++)
{
if(s1[i]=='.')
{
flag=1;
continue;
}
if(flag==0)
a[i]=s1[i];
if(flag==1)
a1[t++]=s1[i];
}
flag=0;
t=0;
for(int i=0;i<strlen(s2);i++)
{
if(s2[i]=='.')
{
flag=1;
continue;
}
if(flag==0)
b[i]=s2[i];
if(flag==1)
b1[t++]=s2[i];
}
// printf("a=%s b=%s a1=%s b1=%s\n",a,b,a1,b1);
int max;
max=strlen(a1);
if(strlen(b1)>max)
max=strlen(b1);
for(int i=0;i<max;i++)
{
if(a1[i]=='\0')
ans[i+1]=b1[i]-'0';
else if(b1[i]=='\0')
ans[i+1]=a1[i]-'0';
else
ans[i+1]=(a1[i]-'0')+(b1[i]-'0');
}
ans[0]=0;
for(int i=max;i>=1;i--)
{
ans[i-1]+=ans[i]/10;
ans[i]=ans[i]%10;
}
int max1;
max1=strlen(a);
if(max1<strlen(b))
max1=strlen(b);
t=1;
int a_len=strlen(a);
int b_len=strlen(b);
for(int i=a_len-max1,j=b_len-max1;i<=max1;i++,j++)
{
if(j<0)
ans1[t++]=a[i]-'0';
if(i<0)
ans1[t++]=b[j]-'0';
if(i>=0&&j>=0)
ans1[t++]=(a[i]-'0')+(b[j]-'0');
}
ans1[max1]+=ans[0];
ans1[0]=0;
for(int i=max1;i>=1;i--)
{
ans1[i-1]+=ans1[i]/10;
ans1[i]=ans1[i]%10;
}
if(ans1[0]!=0)
printf("%d",ans1[0]);
for(int i=1;i<=max1;i++)
{
printf("%d",ans1[i]);
}
//printf("\n");
int k=max;
for(int i=max;i>=0;i--)
{
if(ans[i]!=0)
{
k=i;
break;
}
}
for(int i=1;i<=k;i++)
{
if(i==1)
printf(".");
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}