Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.38 KB | None | 0 0
  1. # дроби
  2. from math import gcd
  3. from functools import total_ordering
  4.  
  5.  
  6. @total_ordering
  7. class Fraction:
  8.  
  9.     def __init__(self, num, denum=1):
  10.         if isinstance(num, float):
  11.             num = int(num*10)
  12.             denum = 10
  13.         if isinstance(num, str):
  14.             num, denum = map(int, num.split('/'))
  15.         # _________________________________________задание 5, урок 17_________________
  16.         assert denum, "Невозможно создать дробь {}/{}".format(num, denum)
  17.         if num != 0:
  18.             self.sign = num * denum // abs(num * denum)  # +-1
  19.         else:
  20.             self.sign = 1
  21.         obj_gcd = gcd(num, denum)
  22.         self.num = abs(num) // obj_gcd
  23.         self.denum = abs(denum) // obj_gcd
  24.  
  25.     def __str__(self):
  26.         to_print = ''
  27.         if self.sign == -1:
  28.             to_print += '-'
  29.         if self.num >= self.denum:
  30.             to_print += '{}'.format(self.num // self.denum)
  31.  
  32.         if self.num >= self.denum and self.num % self.denum != 0:
  33.             to_print += ' and '
  34.  
  35.         if self.num % self.denum != 0:
  36.             to_print += '{}/{}'.format(self.num % self.denum, self.denum)
  37.         return to_print
  38.  
  39.     def red(self):
  40.         self.num = int(self.num)
  41.         self.denum = int(self.denum)
  42.         return Fraction(self.num // gcd(self.num, self.denum), self.denum // gcd(self.num, self.denum))
  43.  
  44.     def __repr__(self):
  45.         return 'Fraction({}, {}, {})'.format(self.num, self.denum, self.sign)
  46.  
  47.     def __add__(self, second):
  48.         if isinstance(second, int) or isinstance(second, float):
  49.             second = Fraction(second)
  50.         assert isinstance(second, Fraction), "сложение обьекта класса fraction и обьекта недопустимого типа"
  51.         new_num = self.sign * self.num * second.denum + second.sign * self.denum * second.num
  52.         new_denum = self.denum * second.denum
  53.         return Fraction(new_num, new_denum)
  54.  
  55.     def __radd__(self, second):
  56.         return self + second
  57.  
  58.     def __neg__(self):
  59.         return Fraction(self.sign * self.num * (-1), self.denum)
  60.  
  61.     def __sub__(self, second):
  62.         return self + (-second)
  63.  
  64.     def __rsub__(self, second):
  65.         pass
  66.  
  67.     def __lt__(self, second):
  68.         return self.sign * self.num * second.denum < second.sign * self.denum * second.num
  69.  
  70.     def __eq__(self, second):
  71.         return not (self < second or second < self)
  72.  
  73.     def __int__(self):
  74.         return self.sign * (self.num // self.denum)
  75.  
  76.     def __pow__(self, power):
  77.         assert isinstance(power, int), "Дробь возводиться в не в целое число"
  78.         if power >= 0:
  79.             self.num, self.denum = self.denum, self.num
  80.             power *= -1
  81.             return Fraction(self.num ** power, self.denum ** power)
  82.         else:
  83.             return Fraction(self.num ** power, self.denum ** power)
  84.  
  85.  
  86.     def __mul__(self, b):
  87.         if isinstance(b, int) or isinstance(b, float):
  88.             b = Fraction(b)
  89.         assert isinstance(b, Fraction), "сложение обьекта класса fraction и обьекта недопустимого типа"
  90.         if isinstance(b, int):
  91.             gcd_int = gcd(b, self.denum)
  92.             if gcd_int > 1:
  93.                 return Fraction(self.num * (b // gcd_int), self.denum // gcd_int)
  94.             else:
  95.                 return Fraction(self.num * b, self.denum)
  96.         elif isinstance(b, Fraction):
  97.             num = self.num * b.num
  98.             demun = self.denum * b.denum
  99.             return Fraction(num // gcd(num, demun), demun // gcd(num, demun))
  100.  
  101.     def myFloat(self):
  102.         ans = str((self.num // self.denum)) + "."
  103.         l = {}
  104.         index = 0
  105.         self.num = self.num % self.denum
  106.         l[self.num] = index
  107.         t = False
  108.         while t == False:
  109.             if self.num == 0:
  110.                 break
  111.             digit = self.num * 10 // self.denum
  112.             self.num = self.num * 10 - (self.num * 10 // self.denum) * self.denum
  113.             if self.num not in l:
  114.                 ans += str(digit)
  115.                 index += 1
  116.                 l[self.num] = index
  117.                 t = False
  118.             else:
  119.                 ans += str(digit) + ")"
  120.                 ans = ans[:l.get(self.num) + len(ans[:ans.index(".") + 1])] + "(" + ans[l.get(self.num) + len(
  121.                     ans[:ans.index(".") + 1]):]
  122.                 t = True
  123.         if self.sign == -1:
  124.             return "- " + ans
  125.         return ans
  126.  
  127.  
  128. # print("тест к заданию 5, урока 17")
  129. # print("3/2^-5")
  130. # a = Fraction(3, 2)
  131. # print(a**-5)
  132. #
  133. # print()
  134. # print("дробь 3/0")
  135. a = Fraction(3, 2)
  136.  
  137. print("тест к заданию 5, урока 17")
  138. print("тест на ад:")
  139. print("test 1:      5 + 3/2   =  ", 5 + a,   "     (int + fraction)")
  140. print("test 2:      5.8 + 3/2 =  ", 5.8 + a,  "    (float + fraction)")
  141. print("test 3:      True + 3/2=  ", True + a, "     (bool + fraction)")
  142. # print("test 4 (обработка ошибки, str + fraction):", "qwerty" + a)
  143.  
  144.  
  145. print()
  146. print("тест на mul:")
  147. print("test 1:      5 * 3/2   =  ", a * 5,    "     (int * fraction)")
  148. print("test 2:      5.8 * 3/2 =  ", a * 5.8,  "    (float * fraction)")
  149. print("test 3:      True * 3/2=  ", a * True, "     (bool * fraction)")
  150. # print("test 4 (обработка ошибки, str * fraction):", "qwerty" * a)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement