fork download
  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. // NWD
  7. int64 gcd(int64 a, int64 b) {
  8. while (b != 0) {
  9. int64 r = a % b;
  10. a = b;
  11. b = r;
  12. }
  13. return a;
  14. }
  15.  
  16. // sprawdzenie potegi dwojki
  17. bool isPowerOfTwo(int64 n) {
  18. return n > 0 && ((n & (n - 1)) == 0);
  19. }
  20.  
  21. int main() {
  22. int64 num, den;
  23. cout << "Podaj licznik i mianownik: ";
  24. cin >> num >> den;
  25.  
  26. if (den <= 0) {
  27. cout << "Blad: mianownik musi byc dodatni\n";
  28. return 0;
  29. }
  30.  
  31. // skracanie ulamka
  32. int64 g = gcd(llabs(num), den);
  33. num /= g;
  34. den /= g;
  35.  
  36. // warunek: mianownik NIE moze byc potega 2
  37. if (isPowerOfTwo(den)) {
  38. cout << "Mianownik NIE moze byc potega liczby 2!\n";
  39. return 0;
  40. }
  41.  
  42. cout << "Rozwiniecie binarne: 0.";
  43.  
  44. map<int64, int> visited;
  45. string result = "";
  46.  
  47. int64 rest = llabs(num % den);
  48. int pos = 0;
  49. int startPeriod = -1;
  50.  
  51. while (rest != 0) {
  52. if (visited.count(rest)) {
  53. startPeriod = visited[rest];
  54. break;
  55. }
  56.  
  57. visited[rest] = pos++;
  58. rest *= 2;
  59.  
  60. if (rest >= den) {
  61. result += '1';
  62. rest -= den;
  63. } else {
  64. result += '0';
  65. }
  66. }
  67.  
  68. // 출력
  69. if (startPeriod == -1) {
  70. cout << result << endl;
  71. } else {
  72. for (int i = 0; i < result.size(); i++) {
  73. if (i == startPeriod) cout << "(";
  74. cout << result[i];
  75. }
  76. cout << ")" << endl;
  77. }
  78.  
  79. return 0;
  80. }
  81.  
Success #stdin #stdout 0.01s 5324KB
stdin
3 6
stdout
Podaj licznik i mianownik: Mianownik NIE moze byc potega liczby 2!