HDOJ 1753 大明A+B

Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
这道题有点小麻烦,交了好几次wa   很多小陷阱  注意考虑全面啊。。。。
View Code
#include<stdio.h>
#include<string.h>
int main()
{
    int a[420], b[420], c[900];
    int len1, len2, x, y, i, j, k, x1, y1, flag;
    char str1[420], str2[420],u,v;
    while(scanf("%s%c%s%c",str1,&u,str2,&v) != EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        len1 = strlen(str1);
        len2 = strlen(str2);
        flag=0;//flag的作用通过x = len1;y = len2;实现
        for(i = 0; i < len1; i++)
        {
            if(str1[i] >= '0' && str1[i] <= '9')
            a[i]=str1[i] - '0';
            else
            {
                x = i;
                flag = 1;
            }
        }
        if(flag == 0)
        {
            x = len1;
        }

        flag = 0;
        for(i = 0; i < len2; i++)
        {
            if(str2[i] >= '0' && str2[i] <= '9')
            b[i] = str2[i]-'0';
            else
            {
                y = i;
                flag = 1;
            }
        }
        //寻找小数点位置并转化字符串
        if(flag == 0)
        {
             y = len2;
        }

        if(len1-x > len2-y)
        {
            x1 = len1 - 1;
            y1 = y + len1 - x - 1;
            j = 450 + len1 - x - 1;
        }
        else
        {
            x1 = x + len2 - y - 1;
            y1 = len2 - 1;
            j = 450 + len2 - y - 1;
        }
        if(j < 450)
        j = 450//j必须大于450,否则其小数部分为0;
        k = j;
        for(;x1 > x; x1--,y1--)
        {
           c[k] += a[x1] + b[y1];
            if(c[k] > 9)
            {
                if(k==451)
                    c[k-2]++;//小数位向整数位进一位时
                else
                    c[k-1]++;
                c[k] -= 10;
            }
            k--;
        }
        //先处理小数部分
        k=449;
        for(x1 = x-1, y1 = y-1; x1 >= 0||y1 >= 0; x1--,y1--)
        {
            c[k] += a[x1] + b[y1];
            if(c[k] > 9)
            {
                c[k-1]++;
                c[k] -= 10;
            }
            k--;
        }
        //后处理整数部分
        for(i = 0; i <= 449; i++)
        {
            if(c[i] != 0)
            break;
        }
        if(i == 450)
            printf("0");//整数为0时
        else
            for(; i <= 449; i++)
                printf("%d",c[i]);

        for(k = j; k >= 451; k--)
        if(c[k] != 0)
        break;
        if(k == 450)
        printf("\n");//小数为0时,无小数点
        else
        {
            printf(".");
            for(i = 451; i <= k; i++)
            printf("%d",c[i]);//输出小数
            printf("\n");
        }
    }
    return 0;
}

 

posted @ 2012-07-25 11:42  琳&leen  阅读(207)  评论(0编辑  收藏  举报