fork download
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. int main() {
  7. long long a, b; // licznik i mianownik
  8. cin >> a >> b;
  9.  
  10. // zakładamy ułamek właściwy
  11. cout << "Rozwiniecie binarne: 0.";
  12.  
  13. long long numerator = a;
  14. map<long long, int> seen; // remainder -> position
  15. vector<int> digits; // kolejne cyfry binarne
  16.  
  17. int pos = 0;
  18. int repeat_start = -1;
  19.  
  20. while (numerator != 0) {
  21. // jeśli już widzieliśmy resztę -> zaczyna się okres
  22. if (seen.find(numerator) != seen.end()) {
  23. repeat_start = seen[numerator];
  24. break;
  25. }
  26.  
  27. seen[numerator] = pos;
  28.  
  29. numerator *= 2;
  30. if (numerator >= b) {
  31. digits.push_back(1);
  32. numerator -= b;
  33. } else {
  34. digits.push_back(0);
  35. }
  36. pos++;
  37. }
  38.  
  39. // wypisanie wyniku
  40. if (numerator == 0) {
  41. // brak okresu
  42. for (int d : digits) cout << d;
  43. cout << "\n";
  44. } else {
  45. // mamy okres
  46. for (int i = 0; i < repeat_start; i++)
  47. cout << digits[i];
  48.  
  49. cout << "(";
  50. for (int i = repeat_start; i < (int)digits.size(); i++)
  51. cout << digits[i];
  52. cout << ")\n";
  53. }
  54.  
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 5312KB
stdin
1 3
stdout
Rozwiniecie binarne: 0.(01)