代码如下,洛谷A+BProblem能过,但是一本通只有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