大明A+B

大明A+B

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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<stdio.h>

#include<string.h>

#include<cstring>

int main()

{

    int c[500],d[500],e[500],f[500],x[500],y[500],m,n,i,j,t,k,p,q;

    char a[500],b[500];

    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>=10)

                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>=10)

                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)

        {

            if(x[j-1]==0)

            {

                j=j-1;    //如果小数后面为0消除0

            }

        }

        if(j>0)     //没有小数不输出小数点

            printf(".");

        for(i=0;i<j;i++)

            printf("%d",x[i]);

        printf("\n");

    }

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值