HDU1753 (大正小数相加)

Posted 若有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于HDU1753 (大正小数相加)的主要内容,如果未能解决你的问题,请参考以下文章

高精度小数加法

超大字符串型整数相加的简单实现

HDU 1753 大明A+B

假期训练六(poj-1753,递归+hdu-2844,多重背包)

JavaScript中大数相加的解法

#yyds干货盘点#JS两个大数相加