hdu1753(大小数相加)

本文介绍了一种处理字符串形式浮点数加法的方法,并通过C++代码实现了该算法。文章详细展示了如何逐位处理整数部分和小数部分,进行进位处理,并最终输出结果。


之前一直wa是因为代码运行时有字符越界的情况,虽然结果没问题但是系统不让过

99999.889 0.111

1000.0 10000.0
112233.1 333.9
123450000 777
123400000 777.700
0.000 0.0000
99999 1
1.2333 20.2667

1212121212.1111111 21212121.33300000000000000


#include <iostream>

#include <string.h>

#include <stdio.h>

using namespace std;

char s1[1005],s2[1005];

int te[1005],s3[1005];

char x1[1005],x2[1005];

char s4[1005]={'0'};

int main()

{

    while(scanf("%s %s",s1,s2)!=EOF)

    {

        int n1=strlen(s1);

        int n2=strlen(s2);

        int n=n1>n2?n1:n2;

        for(int i=0;i<n;i++)

        {

            if(s1[i]=='.'&&i<n1)

            {

                n1=i;

                strcpy(x1,s1+i+1);

            }

            if(s2[i]=='.'&&i<n2)

            {

                strcpy(x2,s2+i+1);

                n2=i;

            }

        }

        int m1=strlen(x1);

        int m2=strlen(x2);

        int m=m1>m2?m1:m2;

        int temp=0;

        memset(te,0,sizeof(te));

        for(int i=m-1;i>=0;i--)

        {

            if(i<m1)

                te[i]=te[i]+x1[i]-'0';

            if(i<m2)

                te[i]+=x2[i]-'0';

            if(te[i]>=10)

            {

                if(i==0)

                    temp=te[i]/10;

                else

                    te[i-1]=te[i]/10;

                te[i]=te[i]%10;

            }

        }

        memset(s3,0,sizeof(s3));

        int k=0,x,y;

        for(x=n1-1,y=n2-1;;x--,y--)

        {

            if(x<0&&y<0)

                break;

            if(x>=0)

                s3[k]+=s1[x]-'0';

            if(y>=0)

                s3[k]+=s2[y]-'0';

            if(temp!=0)

            {

                s3[k]+=temp;

                temp=0;

            }

            if(s3[k]>=10)

            {

                s3[k+1]=s3[k]/10;

                s3[k]=s3[k]%10;

            }

            k++;

        }

        k++;

        while(te[m-1]==0)

            m--;

        while(s3[k-1]==0)

            k--;

        if(k<=0)

            printf("0");

        else

        {

            for(int i=k-1;i>=0;i--)

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

        }

        if(te[m-1]!=0&&m>0)

        {

            printf(".");

            for(int i=0;i<m;i++)

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

        }

        printf("\n");

        strcpy(x1,s4);

        strcpy(x2,s4);

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值