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;
    }
}