Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <vector>
- #include <stdio.h>
- #include <unordered_map>
- #include <sstream>
- #include <iostream>
- using namespace std;
- string rational_to_string(int numerator, int denom)
- {
- std::stringstream ss;
- if(denom == 0)
- {
- ss << ((numerator < 0) ? '-' : '+') << "INF";
- return ss.str();
- }
- const bool negative = (numerator * denom < 0);
- if(negative) { ss << '-'; }
- float n(std::abs(numerator)), d(std::abs(denom));
- int integer_part;
- if(n < d)
- {
- integer_part = 0;
- }
- else
- {
- integer_part = int(n/d);
- n -= float(integer_part) * d;
- }
- ss << integer_part;
- typedef unordered_map<int, int> num_pos_map_t;
- num_pos_map_t prev_numerators;
- vector<int> frac_digits;
- size_t period_begin = INT_MAX, period_end = INT_MAX;
- for(size_t pos = 0; n > 0; ++pos)
- {
- num_pos_map_t::iterator it;
- if((it = prev_numerators.find(n)) != prev_numerators.end())
- {
- period_begin = it->second;
- period_end = pos;
- break;
- }
- prev_numerators[n] = pos;
- n *= 10.0f;
- int digit = int(n/d);
- frac_digits.push_back(digit);
- n -= digit * d;
- }
- if(!frac_digits.empty())
- {
- ss << '.';
- size_t i;
- for(i = 0; i < frac_digits.size(); ++i)
- {
- if(i == period_begin)
- {
- ss << '(';
- }
- ss << frac_digits[i];
- }
- if(i >= period_end)
- {
- ss << ')';
- }
- }
- return ss.str();
- }
- int main(int argc, char* argv[])
- {
- std::cout << rational_to_string(0,0) << '\n';
- std::cout << rational_to_string(0,1) << '\n';
- std::cout << rational_to_string(-1,0) << '\n';
- std::cout << rational_to_string(5,3) << '\n';
- std::cout << rational_to_string(-5,3) << '\n';
- std::cout << rational_to_string(-5,-3) << '\n';
- std::cout << rational_to_string(3227,555) << '\n';
- std::cout << rational_to_string(13,720) << '\n';
- std::cout << rational_to_string(-1,57) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment