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


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    多线程的互斥(下)——信号量
    Linux下几种另类创建文件之方法
    Linux下VsFTP和ProFTP用户管理高级技巧 之一
    全面了解Linux下Proc文件系统
    许可证大阅兵
    SSH远程快速登录Linux
    为root账户更名
    Linux集群的I/O性能测试
    Think Pad笔记本分区解决思路及方法
    图形界面备份Linux系统介绍
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4841201.html
Copyright © 2020-2023  润新知