高精度模板求助
  • 板块灌水区
  • 楼主cygnus_beta
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/5/26 22:06
  • 上次更新2023/11/4 22:41:08
查看原帖
高精度模板求助
452531
cygnus_beta楼主2021/5/26 22:06

代码如下,洛谷A+BProblemA+B Problem能过,但是一本通只有80pts。

#ifndef PRECISION_HPP
#define PRECISION_HPP

#include<algorithm>
#include<iostream>
#include<string>

namespace cyg{
    class precision{
    public:
        std::string number;
        std::string buf;

        static bool carry(std::string& num,std::string::iterator iter){
            if(iter!=num.end() and *iter-'0'>9){
                if(iter==num.end()-1){
                    num.push_back((*iter-'0')/10+'0');
                    iter=num.end()-2;
                    *iter=(*iter-'0')%10+'0';
                    return true;
                }
                else(*(iter+1))+=(*iter-'0')/10,*iter=(*iter-'0')%10+'0';
            }
            return false;
        }
    public:
        precision():number("0"){}

        precision(std::string init){
            std::reverse(init.begin(),init.end());
            number=init;
        }

        precision operator+(precision b){
            if(b.number.size()<=this->number.size()){
                b.buf=this->number;
                std::string::iterator num_iter=b.buf.begin();
                for(std::string::iterator iter=b.number.begin();iter!=b.number.end() and num_iter!=b.buf.end();iter++,num_iter++){
                    *num_iter+=*iter-'0';
                    carry(b.buf,num_iter);
                }
                for(;num_iter!=b.buf.end();num_iter++)if(carry(b.buf,num_iter))break;
                b.number=b.buf;
                return b;
            }
            else{
                this->buf=b.number;
                std::string::iterator num_iter=this->buf.begin();
                for(std::string::iterator iter=this->number.begin();iter!=this->number.end() and num_iter!=this->buf.end();iter++,num_iter++){
                    *num_iter+=*iter-'0';
                    carry(this->buf,num_iter);
                }
                for(;num_iter!=this->buf.end();num_iter++)if(carry(this->buf,num_iter))break;
                b.number=this->buf;
                return b;
            }
        }

        friend std::istream& operator>>(std::istream& in,precision& b);

        friend std::ostream& operator<<(std::ostream& out,const precision& b);
    };

    std::istream& operator>>(std::istream& in,precision& b){
        std::string buf;
        in>>buf;
        std::reverse(buf.begin(),buf.end());
        b.number=buf;
        return in;
    }

    std::ostream& operator<<(std::ostream& out,const precision& b){
        std::string buf=b.number;
        std::reverse(buf.begin(),buf.end());
        out<<buf;
        return out;
    }
}

#endif

2021/5/26 22:06
加载中...