话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
解题思路:
找到小数点把整数部分和小数部分分开
先计算小数部分再计算整数部分(防止小数部分进位)
计算过程和大数加法一样(小数部分位数小的注意补0)
使用数组存储数,再逆序模拟加法
输出的时候注意判断小数点是否存在
#include<stdio.h>
#include<string.h>
char s1[500],s2[500];
int a[500],b[500],c[500],d[500];
int main(){
int i,j,k,len1,len2,s,t,kk1,kk2;
while(scanf("%s %s",s1,s2)!=EOF)
{
//别忘了初始化
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
len1=strlen(s1);
len2=strlen(s2);
s=len1;
t=len2;
//找到小数点位置
for(i=0;i<len1;i++)
if(s1[i]=='.')
{
s=i;
break;
}
for(i=0;i<len2;i++)
if(s2[i]=='.')
{
t=i;break;
}
//小数部分 //先算小数部分防止有进位
k=1;
if(s+1<len1)
for(j=s+1;j<=len1-1;j++)
c[k++]=s1[j]-'0';
k=1;
if(t+1<len2)
for(j=t+1;j<=len2-1;j++)
d[k++]=s2[j]-'0';
kk1=len1-s;
if(len2-t>kk1)
kk1=len2-t;
for(i=kk1;i>=1;i--)
{
c[i]+=d[i];
if(c[i]>=10)
{
c[i]-=10;
c[i-1]++;
}
}
//整数部分
k=0;
for(j=s-1;j>=0;j--)
a[k++]=s1[j]-'0';
k=0;
for(j=t-1;j>=0;j--)
b[k++]=s2[j]-'0';
kk2=s-1;
if(t-1>kk2)
kk2=t-1;
a[0]+=c[0];//小数进位
for(i=0;i<=kk2;i++){
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
a[i+1]++;
}
}
//输出整数部分
if(a[kk2+1])
printf("%d",a[kk2+1]);
for(i=kk2;i>=0;i--)
printf("%d",a[i]);
//输出小数部分
for(i=kk1;i>=1;i--)
if(c[i])
break;
if(i)//判断是否有小数
{
printf(".");
for(j=1;j<=i;j++)
printf("%d",c[j]);
}
printf("\n");
}
return 0;
}