Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我AC得好像很繁琐#include <algorithm> #include <cassert> #include <cstdlib> #include <iterator> #include <iostream> #include <iomanip> #include <limits> #include <string> #include <sstream> #include <vector> using namespace std; #pragma warning(disable : 4267) void ParseIn(const long double& _s, vector<int>& _vec_s, size_t& _factor) { size_t found; stringstream ss; string str; int tmp; ss <<fixed ; ss <<_s; str = ss.str(); // trim front 0s found =str.find_first_not_of('0'); if(found!=string::npos) str.erase(0,found); // trim back 0s found =str.find_last_not_of('0'); if(found!=string::npos && found!=str.size()-1) str.erase(found+1); // trim point found = str.find_first_of('.'); if(found!=string::npos) { _factor = str.size() - found - 1; str.erase(found, 1); } // trim front 0s again after trim point found =str.find_first_not_of('0'); if(found!=string::npos && found!=0) str.erase(0,found); for(size_t i=0; i<str.size(); ++i) { tmp = atoi(string(1,str[i]).c_str()); _vec_s.push_back(tmp); } reverse(_vec_s.begin(), _vec_s.end()); } void ParseOut(vector<int>& _vec_s, string& _str ) { size_t found; ostringstream oss; reverse(_vec_s.begin(), _vec_s.end()); copy(_vec_s.begin() ,_vec_s.end() ,ostream_iterator<int>(oss)); _str = oss.str(); // trim front 0s found =_str.find_first_not_of('0'); if(found!=string::npos) _str.erase(0,found); //// trim back 0s //found =_str.find_last_not_of('0'); //if(found!=string::npos && found!=_str.size()-1) // _str.erase(found+1); } vector<int> Mutiply(const vector<int>& _vec_a, const vector<int>& _vec_b) { int carry; int tmp; vector<int> vec_ret(_vec_a.size() + _vec_b.size()); if (1==_vec_a.size() && 1==_vec_a[0]) return _vec_b; if (1==_vec_b.size() && 1==_vec_b[0]) return _vec_a; for(size_t i =0; i<_vec_a.size(); ++i) { carry = 0; for(size_t j=0; j<_vec_b.size(); ++j) { tmp = vec_ret[i+j] + _vec_a[i] * _vec_b[j] +carry; vec_ret[i+j] = tmp%10; carry = tmp/10; } vec_ret[i+_vec_b.size()] = carry; } return vec_ret; } string ComputeExp(const long double& _s, const size_t& _n) { vector<int> vec_s; vector<int> vec_d; stringstream ss; string str; size_t factor; int pos; ParseIn(_s, vec_s, factor); if (_s<numeric_limits<long double>::epsilon()) return string("0"); if (0==_n) return string("1"); vec_d.push_back(1); for (size_t k=1; k<=_n; ++k) vec_d = Mutiply(vec_d, vec_s); ParseOut(vec_d, str); pos = str.size() - _n*factor; if (pos==str.size()) return str; else if (pos>=0) str.insert(pos, "."); else { size_t count = static_cast<size_t>(abs(pos)); str.insert(0, count, '0'); str.insert(0, "."); } return str; } int main() { long double s; size_t n; while(cin >>s >>n ) cout <<ComputeExp(s, n) <<endl; return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator