fork download
  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. int64 gcd(int64 a, int64 b) {
  7. while (b != 0) {
  8. int64 r = a % b;
  9. a = b;
  10. b = r;
  11. }
  12. return a;
  13. }
  14.  
  15. bool isPowerOfTwo(int64 n) {
  16. return n > 0 && ((n & (n - 1)) == 0);
  17. }
  18.  
  19. int main() {
  20. int64 num, den;
  21.  
  22. cout << "Podaj licznik i mianownik: ";
  23. if (!(cin >> num >> den)) {
  24. cout << "BLAD: nie wczytano danych!\n";
  25. return 0;
  26. }
  27.  
  28. if (den == 0) {
  29. cout << "Blad: mianownik = 0\n";
  30. return 0;
  31. }
  32.  
  33. int64 g = gcd(llabs(num), llabs(den));
  34. num /= g;
  35. den /= g;
  36.  
  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> used;
  45. string bits;
  46.  
  47. int64 r = llabs(num % den);
  48. int pos = 0, start = -1;
  49.  
  50. while (r != 0) {
  51. if (used.count(r)) {
  52. start = used[r];
  53. break;
  54. }
  55. used[r] = pos++;
  56. r *= 2;
  57.  
  58. if (r >= den) {
  59. bits += '1';
  60. r -= den;
  61. } else {
  62. bits += '0';
  63. }
  64. }
  65.  
  66. if (start == -1) {
  67. cout << bits;
  68. } else {
  69. for (int i = 0; i < bits.size(); i++) {
  70. if (i == start) cout << "(";
  71. cout << bits[i];
  72. }
  73. cout << ")";
  74. }
  75. cout << endl;
  76.  
  77. return 0;
  78. }
  79.  
Success #stdin #stdout 0s 5320KB
stdin
2 5
stdout
Podaj licznik i mianownik: Rozwiniecie binarne: 0.(0110)