fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. using namespace std;
  5.  
  6. // funkcja skracająca ułamek
  7. long long gcd(long long a, long long b) {
  8. while (b) swap(a %= b, b);
  9. return a;
  10. }
  11.  
  12. int main() {
  13. long long a, b;
  14. cout << "Podaj licznik a i mianownik b (ułamek właściwy a < b): ";
  15. cin >> a >> b;
  16.  
  17. long long g = gcd(a, b);
  18. a /= g;
  19. b /= g;
  20.  
  21. cout << "Ułamek nieskracalny: " << a << "/" << b << endl;
  22.  
  23. // rozwinięcie binarne
  24. vector<int> digits;
  25. map<long long, int> seen;
  26.  
  27. long long num = a;
  28. int pos = 0;
  29. int start_period = -1;
  30.  
  31. while (true) {
  32. if (seen.count(num)) {
  33. start_period = seen[num];
  34. break;
  35. }
  36. seen[num] = pos;
  37.  
  38. num *= 2;
  39. digits.push_back(num / b);
  40. num %= b;
  41.  
  42. if (num == 0) break; // rozwinięcie skończone (gdyby doszło do takiej sytuacji)
  43. pos++;
  44. }
  45.  
  46. // wypisanie wyniku
  47. cout << "Rozwinięcie binarne: 0.";
  48.  
  49. if (start_period == -1) {
  50. // przypadek skończony (teoretycznie nie wystąpi dla b nie będącego potęgą 2)
  51. for (int d : digits) cout << d;
  52. cout << endl;
  53. } else {
  54. // wypisujemy część nieokresową
  55. for (int i = 0; i < start_period; i++)
  56. cout << digits[i];
  57.  
  58. cout << "(";
  59.  
  60. // część okresowa
  61. for (int i = start_period; i < digits.size(); i++)
  62. cout << digits[i];
  63.  
  64. cout << ")" << endl;
  65. }
  66.  
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0s 5308KB
stdin
1 3
stdout
Podaj licznik a i mianownik b (ułamek właściwy a < b): Ułamek nieskracalny: 1/3
Rozwinięcie binarne: 0.(01)