zoukankan      html  css  js  c++  java
  • HDU1753 (大正小数相加)

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1753

    大明A+B

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 14422    Accepted Submission(s): 5290


    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
    分析:
    一共3种情况:
    1.两个数都是整数
    2.两个数都是小数
    3.一个整数,一个小数
    将他们都变成两个小数的情况,很巧妙,然后就是小数点对齐,空的地方补0(首尾),使得化成的两个小数的长度是一样的,然后就是大数加法的知识了
    注意点:
    1.小数部分对整数部分有进位的时候,进位不要加在了小数点上面
    2.结果是整数的时候,只输出整数部分,比如4.000要输出4
    3.结果后面多余的0要去掉,比如2.10000要变成2.1
    4.注意输入是这种情况的时候:
    1.56  .36(就是小于1的小数输入的时候他把0去掉了)
    代码如下:
    #include<bits/stdc++.h>
    using namespace std;
    string add(string str1,string str2)
    {
        int l1=str1.length(),l2=str2.length();
        int x1=0,x2=0,y1=0,y2=0;
        for(int i=l1-1;i>=0;i--)
        {
            if(str1[i]!='.')
            {
                y1++;
                if(y1==l1)
                {
                    str1=str1+'.'+'0';
                    y1=1;
                }
            }
            else
                break;
        }
        for(int i=l2-1;i>=0;i--)
        {
            if(str2[i]!='.')
            {
                  y2++;
                  if(y2==l2)
                  {
                      str2=str2+'.'+'0';
                      y2=1;
                  }
            }
            else
                break;
        }
        if(y1>y2)
        {
            int k=y1-y2;
            for(int i=1;i<=k;i++)
            {
                str2=str2+'0';
            }
        }else if(y1<y2)
        {
            int k=y2-y1;
            for(int i=1;i<=k;i++)
            {
                str1=str1+'0';
            }
        }
        for(int i=0;i<l1;i++)
        {
            if(str1[i]!='.')
                x1++;
            else
                break;
        }
        for(int i=0;i<l2;i++)
        {
            if(str2[i]!='.')
                x2++;
            else
                break;
        }
        if(x2>x1)
        {
            int k=x2-x1;
            for(int i=1;i<=k;i++)
            {
                str1="0"+str1;
            }
        }else if(x1>x2)
        {
            int k=x1-x2;
            for(int i=1;i<=k;i++)
            {
                str2="0"+str2;
            }
        }
        l1=str1.length();
        string str3="";
        int c=0;
        for(int i=l1-1;i>=0;i--)
        {
            if(str1[i]=='.')
            {
                str3='.'+str3;
                continue;
            }
            int x=str1[i]-'0'+str2[i]-'0'+c;
            c=x/10;
            x=x%10;
            str3=char(x+'0')+str3;
        }
        if(c!=0)
        {
            str3=char(c+'0')+str3;
        }
        int l3=str3.length(),f=1;
        for(int i=l3-1;str3[i]!='.';i--)
        {
            if(str3[i]!='0')
                f=0;
        }
        if(f==1)
        {
            string str4="";
            for(int i=0;str3[i]!='.';i++)
            {
                str4=str4+str3[i];
            }
            return str4;
        }
        string str5="";
        int ff;
        l3=str3.length();
        for(int i=l3-1;i>=0;i--)
        {
           if(str3[i]!='0')
           {
               ff=i;
               break;
           }
        }
        for(int i=ff;i>=0;i--)
        {
            str5=str3[i]+str5;
        }
        return str5;
    }
    int main()
    {
        string a,b;
        while(cin>>a>>b)
        {
            string r=add(a,b);
            cout<<r<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Numpy入门
    Numpy入门
    Spring源码之IoC原理
    LeetCode之连续子数组的最大和
    剑指Offer之从1到n整数中1出现的次数
    剑指Offer之最小的k个数
    剑指Offer之字符串的排列
    剑指Offer之二叉搜索树与双向链表
    剑指Offer之二叉树中和为某一值的路径
    剑指Offer之二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/yinbiao/p/8759046.html
Copyright © 2011-2022 走看看