首页 > 代码库 > hdu1753(模拟大实数相加)

hdu1753(模拟大实数相加)

题目信息: 手动求大实数相加和

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


AC代码:

/**
 *大实数相加,以小数点为分界,模拟加法运算,最后合并
 */
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string s1,string s2){//字符串模拟大整数加法,模拟结果有前导0
    int i,j,len1,len2;
    len1=s1.size(); len2=s2.size();
    //寻找小数点的位置
    for(i=0;s1[i]!=‘.‘&&i<len1;i++);
    for(j=0;s2[j]!=‘.‘&&j<len2;j++);
    //cout<<i<<" "<<j<<endl;
    string s,ss;
    int flag=0;
    //模拟小数点后面的数相加
    len1--; len2--;
    while(len1-i>len2-j){
        int sum=flag+(s1[len1--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    //cout<<s<<endl;
    while(len2-j>len1-i){
        int sum=flag+(s2[len2--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    //使小数点后位数对齐之后相加
    int len11,len22;
    if(len1-i>len2-j){
       len11=len1-((len1-i)-(len2-j));
       len22=len2;
    }
    else{
        len22=len2-((len2-j)-(len1-i));
        len11=len1;
    }
    while(len11>i&&len22>j){
        int sum=flag+(s1[len11--]-‘0‘)+(s2[len22--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    /**迭代器去除字符’0‘
    while(len11>i){
        int sum=flag+(s1[len11--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    while(len22>j){
        int sum=flag+(s2[len22--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    string::iterator it;//定义方向迭代器
    for(it=s.begin();*it==‘0‘&&it!=s.end();it++){//去掉s的前缀0,即小数后的0
        s.erase(it);
    }**/
    //cout<<s<<endl;
    string ss0;//用ss0去掉前导0
    int kk;
    for(kk=0;kk<s.size()&&(s[kk]==‘0‘||s[kk]==‘.‘);kk++);
    for(int k=kk;k<s.size();k++) ss0+=s[k];
    //cout<<ss0<<endl;
    for(int i=0;i<ss0.size()/2;i++){
        char c=ss0[i];
        ss0[i]=ss0[ss0.size()-i-1];
        ss0[ss0.size()-i-1]=c;
    }
    //模拟小数点前面的数相加
    len1=i-1; len2=j-1;
    while(len1>-1&&len2>-1){
        int sum=flag+(s1[len1--]-‘0‘)+(s2[len2--]-‘0‘);
        ss+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    while(len1>-1){
        int sum=flag+(s1[len1--]-‘0‘);
        ss+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    while(len2>-1){
        int sum=flag+(s2[len2--]-‘0‘);
        ss+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    if(flag) ss+=char (‘0‘+flag);
    //cout<<s<<endl;
    for(int i=0;i<ss.size()/2;i++){
        char c=ss[i];
        ss[i]=ss[ss.size()-i-1];
        ss[ss.size()-i-1]=c;
    }
    //cout<<ss<<endl;
    if(!ss0.empty()&&ss0[0]!=‘.‘) ss=ss+‘.‘+ss0;
    if(!ss0.empty()&&ss0[0]==‘.‘) ss=ss+ss0;
    return ss;
}
int main()
{
    string s1,s2;
    while(cin>>s1>>s2){
        cout<<add(s1,s2)<<endl;
    }
    return 0;
}


hdu1753(模拟大实数相加)