zoukankan      html  css  js  c++  java
  • HDU 1753 大明A+B (大正小数加法、字符串处理)

    大明A+B

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

     

    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

    题目分析

    带小数的大数加法,我们只需要将整数部分和小数部分分别相加 然后处理进位即可

    但是需要注意的是:

    • 小数的加法与整数略有不同,它是左对齐的,短的需要在右边补零
    • 要注意输出的时候多余的0和小数点要舍弃
    • 输入的时候有可能存在 .123的情况 也就是整数部分为0,但是没有直接写出来的情况

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    
    string a,b;
    int i,ia,ib;
    
    string bigadd(string a,string b)
    {
        int jin=0,i;
        char ai,bi;
        string anss;
        int lena=a.size();
        int lenb=b.size();
        if(lena>lenb)
        anss=a;
        else
        anss=b;
        int lenmax=max(lena,lenb);
        int p=lena-1;
        int q=lenb-1;
        for(i=lenmax-1;i>=0;i--)
        {
            if(p<0)
            ai='0';
            else
            ai=a[p];
            if(q<0)
            bi='0';
            else
            bi=b[q];
            anss[i]=((ai-'0'+bi-'0'+jin)%10)+'0';
            jin=(ai-'0'+bi-'0'+jin)/10;
            p--;
            q--;
        }
        if(jin)
        {
            char x=jin+'0';
            anss=x+anss;
        }
        return anss;
    }
    
    int main()
    {
        while(cin>>a>>b)
        {
            int lena=a.size();
            int lenb=b.size();
            ia=lena;
            ib=lenb;
            for(i=0;i<lena;i++)
            {
                if(a[i]=='.')
                ia=i;
            }
            for(i=0;i<lenb;i++)
            {
                if(b[i]=='.')
                ib=i;
            }
            string prea(a,0,ia);   //整数部分 
            if(prea.empty())
            prea="0";
            
            string preb(b,0,ib);
            if(preb.empty())
            preb="0";
            
            string la="0";         //小数部分 
            if(ia!=lena)
            la=a.substr(ia+1);
            
            string lb="0";      
            if(ib!=lenb)
            lb=b.substr(ib+1);
            
            string presum=bigadd(prea,preb);
            
            if(la.size()>lb.size())                   //补0 
            {
                string bu(la.size()-lb.size(),'0');
                lb=lb+bu;
            }
            if(la.size()<lb.size())
            {
                string bu(lb.size()-la.size(),'0');
                la=la+bu;
            }
            string lsum=bigadd(la,lb);
            
            if(lsum.size()>max(la.size(),lb.size()))    //处理进位 
            {
                string jin=lsum.substr(0,lsum.size()-max(la.size(),lb.size()));
                lsum=lsum.substr(lsum.size()-max(la.size(),lb.size()));
                presum=bigadd(presum,jin);
            }
            for(i=lsum.size()-1;i>=0;i--)         //处理多余的0 
            {
                if(lsum[i]!='0')
                break;
                lsum.erase(i);
            }
            
            if(lsum.empty())
            cout<<presum<<endl;
            else
            cout<<presum<<'.'<<lsum<<endl;
        }
    }

     

  • 相关阅读:
    dnsever 邮件记录
    用于显示上个月和下个月_PHP
    JSON学习
    ASP生成新会员编号
    godaddy_关于产品退款
    Switch Case语句中多个值匹配同一个代码块的写法
    网闸与防火墙的比较
    bench.sh 跑分测速
    Kcptun加速SS
    linux 安全狗
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/11333690.html
Copyright © 2011-2022 走看看