zoukankan      html  css  js  c++  java
  • 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;
    }


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

  • 相关阅读:
    vue中倒计时的用法
    ant.design 中各种问题
    vue-cli3.0跨域代理问题
    vue-cli3.0配置多页面应用
    vue-axios中post和get携带参数和token
    后台返回的时间戳转化为前端的日期
    微信与支付宝二维码在页面中的使用
    git梗概介绍
    键盘和鼠标事件的区别和使用
    vue.js学习笔记(5)— Vue路由传参
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4841201.html
Copyright © 2011-2022 走看看