fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. long long gcd(long long a, long long b) {
  5. while (b != 0) {
  6. long long t = a % b;
  7. a = b;
  8. b = t;
  9. }
  10. return a;
  11. }
  12.  
  13. bool isPowerOfTwo(long long n) {
  14. return n > 0 && (n & (n - 1)) == 0;
  15. }
  16.  
  17. int main() {
  18. long long p, q;
  19. cin >> p >> q; // we/wy zgodne z Ideone
  20.  
  21. // Sprawdzamy, czy ułamek właściwy
  22. if (p >= q) {
  23. cout << "To nie jest ulamek wlasciwy.\n";
  24. return 0;
  25. }
  26.  
  27. // Sprowadzamy do postaci nieskracalnej
  28. long long g = gcd(p, q);
  29. p /= g;
  30. q /= g;
  31.  
  32. // Sprawdzamy, czy mianownik to potęga 2
  33. if (!isPowerOfTwo(q)) {
  34. cout << "Mianownik nie jest potega dwojki.\n";
  35. return 0;
  36. }
  37.  
  38. cout << "0.";
  39.  
  40. // q = 2^k → rozwinięcie ma dokładnie k bitów
  41. while (q > 1) {
  42. p *= 2;
  43. if (p >= q) {
  44. cout << "1";
  45. p -= q;
  46. } else {
  47. cout << "0";
  48. }
  49. q /= 2;
  50. }
  51.  
  52. cout << endl;
  53. return 0;
  54. }
  55.  
Success #stdin #stdout 0.01s 5320KB
stdin
3 7
stdout
Mianownik nie jest potega dwojki.