Advertisement
Ae_Mc

Stepik. Перевод двоичной периодической дроби в десятичную обыкновенную

Nov 1st, 2022
1,086
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.47 KB | None | 0 0
  1. num_in_2_base = input()
  2.  
  3.  
  4. def floating_from_base_to_decimal(floating_in_base: str, base: int):
  5.     result = 0
  6.     for i in range(0, len(floating_in_base)):
  7.         result += int(floating_in_base[i]) * base ** (-i - 1)
  8.     return result
  9.  
  10.  
  11. parts = num_in_2_base.split(".")
  12. if len(parts) == 1:
  13.     print(int(parts[0], 2), 1)
  14. else:
  15.     integer_part = int(parts[0], 2)
  16.     non_periodic_floating_part = 0
  17.     floating_parts = parts[1].split("(")
  18.     if len(floating_parts[0]) > 0:
  19.         non_periodic_floating_part = floating_from_base_to_decimal(
  20.             floating_parts[0], 2
  21.         )
  22.  
  23.     if len(floating_parts) > 1:
  24.         floating_parts[1] = floating_parts[1][:-1]
  25.  
  26.         denominator1 = 2 ** len(floating_parts[1]) - 1
  27.         general_denominator = denominator1 * 2 ** len(floating_parts[0])
  28.         periodic_floating_part = int(floating_parts[1], 2)
  29.         numerator = int(
  30.             (integer_part + non_periodic_floating_part) * general_denominator
  31.             + periodic_floating_part
  32.         )
  33.         for i in range(2, general_denominator + 1, 1):
  34.             while general_denominator % i == 0 and numerator % i == 0:
  35.                 numerator //= i
  36.                 general_denominator //= i
  37.     else:
  38.         general_denominator = 1
  39.         numerator = integer_part + non_periodic_floating_part
  40.         while numerator % 1 > 0:
  41.             numerator *= 2
  42.             general_denominator *= 2
  43.     print(int(numerator), int(general_denominator))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement