#include <iostream>#include <vector>#include <functional>#include <cmath>#include <iterator>#include <string>#include <stdexcept>#include <boost/math/common_factor_rt.hpp>#include <boost/lexical_cast.hpp>classrational_t{intn_,d_;doubler_;public:rational_t(intnumerator,intdenominator):n_(numerator),d_(denominator),r_(static_cast<double>(n_)/static_cast<double>(d_)){}doublereal()const{returnr_;}boolisnan()const{returnstd::isnan(r_);}intnumerator()const{returnn_;}intdenominator()const{returnd_;}};std::ostream&operator<<(std::ostream&os,constrational_t&r){return(os<<r.numerator()<<"/"<<r.denominator());}classcompare_near_to:publicstd::binary_function<bool,rational_t,rational_t>{doubleg_;public:compare_near_to(doublegoal):g_(goal){}booloperator()(constrational_t&lhs,constrational_t&rhs){returnstd::fabs(g_-lhs.real())<std::fabs(g_-rhs.real());}};rational_tfind_rational(doublegoal,intdenominator){doublemin_diff=goal;rational_trat(0,denominator);for(intn=1;;++n){rational_trat_(n,denominator);doublediff=std::fabs(goal-rat_.real());if(diff>min_diff)break;min_diff=diff;rat=rat_;}if(boost::math::gcd(rat.numerator(),rat.denominator())!=1)returnrational_t(0,0);// causes real is NaNreturnrat;}intmain(intc,char**v){if(c!=2){std::cout<<v[0]<<" <real number|rational number>\n";return0;}doublegoal;try{std::stringval(v[1]);std::string::size_typeidx;if((idx=val.find("/"))!=std::string::npos)goal=boost::lexical_cast<double>(val.substr(0,idx))/boost::lexical_cast<double>(val.substr(idx+1,val.length()-(idx+1)));elsegoal=boost::lexical_cast<double>(v[1]);if(goal<=0.0)throwstd::runtime_error("input number must be positive");}catch(conststd::exception&e){std::cerr<<e.what()<<"\n";return-1;}std::vector<rational_t>rationals;for(inti=1;i<10;++i)rationals.push_back(find_rational(goal,i));rationals.erase(std::remove_if(rationals.begin(),rationals.end(),std::mem_fun_ref(&rational_t::isnan)),rationals.end());std::sort(rationals.begin(),rationals.end(),compare_near_to(goal));std::copy(rationals.begin(),rationals.end(),std::ostream_iterator<rational_t>(std::cout,", "));return0;}
turugina
#6517()
[
C++
]
Rating0/0=0.00
Rating0/0=0.00-0+
[ reply ]