fork(1) download
  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. long long gcd(long long a, long long b) {
  6. while (b != 0) {
  7. long long t = a % b;
  8. a = b;
  9. b = t;
  10. }
  11. return a;
  12. }
  13.  
  14. bool isPowerOfTwo(long long n) {
  15. return (n > 0 && (n & (n - 1)) == 0);
  16. }
  17.  
  18. int main() {
  19. long long p, q;
  20. cout << "Podaj licznik i mianownik: ";
  21. cin >> p >> q;
  22.  
  23. // Ułamek właściwy?
  24. if (p >= q) {
  25. cout << "To nie jest ułamek właściwy.\n";
  26. return 0;
  27. }
  28.  
  29. // Sprowadzanie do postaci nieskracalnej
  30. long long g = gcd(p, q);
  31. p /= g;
  32. q /= g;
  33.  
  34. // Czy mianownik jest potęgą 2?
  35. if (!isPowerOfTwo(q)) {
  36. cout << "Mianownik nie jest potega liczby 2.\n";
  37. return 0;
  38. }
  39.  
  40. // Liczenie rozwinięcia binarnego
  41. cout << "Rozwiniecie binarne ulamka " << p << "/" << q << " = 0.";
  42.  
  43. // Ponieważ q = 2^k, rozwinięcie ma dokładnie k cyfr
  44. while (q > 1) {
  45. p *= 2;
  46. if (p >= q) {
  47. cout << "1";
  48. p -= q;
  49. } else {
  50. cout << "0";
  51. }
  52. q /= 2;
  53. }
  54.  
  55. cout << endl;
  56. return 0;
  57. }
  58.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Podaj licznik i mianownik: Mianownik nie jest potega liczby 2.