fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <unordered_map>
  4. using namespace std;
  5.  
  6. string binaryExpansionRepeating(int p, int q) {
  7. string result = "0.";
  8.  
  9. unordered_map<int, int> pos; // zapamiętuje, na której pozycji pojawiła się dana reszta
  10. string fractional = "";
  11.  
  12. int index = 0;
  13.  
  14. while (true) {
  15. // Jeśli reszta się powtórzyła -> mamy okres
  16. if (pos.count(p) > 0) {
  17. int start = pos[p];
  18. // wstawiamy nawiasy oznaczające okres
  19. return "0." + fractional.substr(0, start) + "(" +
  20. fractional.substr(start) + ")";
  21. }
  22.  
  23. pos[p] = index;
  24.  
  25. p *= 2;
  26.  
  27. if (p >= q) {
  28. fractional += '1';
  29. p -= q;
  30. } else {
  31. fractional += '0';
  32. }
  33.  
  34. index++;
  35.  
  36. // jeśli reszta = 0 → rozwinięcie się kończy (nieskończone nie będzie)
  37. if (p == 0) {
  38. return "0." + fractional;
  39. }
  40. }
  41. }
  42.  
  43. int main() {
  44. // zdefiniowany ułamek 3/11
  45. int p = 3;
  46. int q = 11;
  47.  
  48. cout << "Ułamek: " << p << "/" << q << endl;
  49. cout << "Rozwiniecie binarne: " << binaryExpansionRepeating(p, q) << endl;
  50.  
  51. return 0;
  52. }
  53.  
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
Ułamek: 3/11
Rozwiniecie binarne: 0.(0100010111)