zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    7/31 CSU-ACM2018暑期训练7-贪心
    树状数组
    洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】
    如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】
    HDU 1611 敌兵布阵【线段树模板】
    Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
    Hdu 5361 In Touch (dijkatrs+优先队列)
    Codeforces Round #Pi (Div. 2)
    Hdu 5358 First One (尺取法+枚举)
    Poj 3189 Steady Cow Assignment (多重匹配)
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2607987.html
Copyright © 2011-2022 走看看