hdu 1753

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做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
#include
int main()
{
    char s1[500],s2[500];
    int a[500],b[500],c[500],d[500];
    while(~scanf("%s%s",s1,s2))
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        int s,l1,l2,t,i,j;
        l1=strlen(s1);
        l2=strlen(s2);
        s=l1,t=l2;
        for(i=0; i=0; i--)
            a[k++]=s1[i]-'0';//小数点之前的
        k=0;
        for(i=t-1; i>=0; i--)
            b[k++]=s2[i]-'0';
        k=1;
        if(s+1l2-t)
            n1=l1-s;
        else n1=l2-t;
        for(i=n1;i>=1;i--)
        {
             c[i]+=d[i];
             if(c[i]>=10)
             {
                 c[i]=c[i]%10;
                 c[i-1]++;
             }
             //printf("%d %d--\n",c[i],d[i]);
        }
        if(s-1>t-1)
            n2=s-1;
        else n2=t-1;
        a[0]+=c[0];
        for(i=0;i<=n2;i++)
        {
             a[i]+=b[i];
             if(a[i]>=10)
             {
                 a[i]=a[i]%10;
                 a[i+1]++;
             }
        }
        if(a[n2+1]>0)
            printf("%d",a[n2+1]);
        for(i=n2;i>=0;i--)
            printf("%d",a[i]);
        for(i=n1;i>0;i--)
        {
            if(c[i]==0)continue;
            else break;
        }
        int tx=i;
        if(i!=0)
        {
            printf(".");
            for(i=1;i<=tx;i++)
                printf("%d",c[i]);
        }
        printf("\n");
    }
}


  思路:因为是正小数加法,所以在处理的时候,应该把小数部分与整数部分分开数处理,即多开辟几个数组去存储所给数的小数与整数部分,在对整数部分进行处理的时候,应该把整数部分倒着存储进数组中,即原来是123,那么在数组中就是321,这样的话在对两个数组进行加的时候,不会耽误进位的情况,在对小数部分进行操作的时候,直接取出就好了,但是次数数组下表从1开始,这样就算有进位的情况也不会出错,最后在输出的时候要检测小数部分是否全为0,全为0的话不输出.



你可能感兴趣的:(hdu 1753)