Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # дроби
- from math import gcd
- from functools import total_ordering
- @total_ordering
- class Fraction:
- def __init__(self, num, denum=1):
- if isinstance(num, float):
- num = int(num*10)
- denum = 10
- if isinstance(num, str):
- num, denum = map(int, num.split('/'))
- # _________________________________________задание 5, урок 17_________________
- assert denum, "Невозможно создать дробь {}/{}".format(num, denum)
- if num != 0:
- self.sign = num * denum // abs(num * denum) # +-1
- else:
- self.sign = 1
- obj_gcd = gcd(num, denum)
- self.num = abs(num) // obj_gcd
- self.denum = abs(denum) // obj_gcd
- def __str__(self):
- to_print = ''
- if self.sign == -1:
- to_print += '-'
- if self.num >= self.denum:
- to_print += '{}'.format(self.num // self.denum)
- if self.num >= self.denum and self.num % self.denum != 0:
- to_print += ' and '
- if self.num % self.denum != 0:
- to_print += '{}/{}'.format(self.num % self.denum, self.denum)
- return to_print
- def red(self):
- self.num = int(self.num)
- self.denum = int(self.denum)
- return Fraction(self.num // gcd(self.num, self.denum), self.denum // gcd(self.num, self.denum))
- def __repr__(self):
- return 'Fraction({}, {}, {})'.format(self.num, self.denum, self.sign)
- def __add__(self, second):
- if isinstance(second, int) or isinstance(second, float):
- second = Fraction(second)
- assert isinstance(second, Fraction), "сложение обьекта класса fraction и обьекта недопустимого типа"
- new_num = self.sign * self.num * second.denum + second.sign * self.denum * second.num
- new_denum = self.denum * second.denum
- return Fraction(new_num, new_denum)
- def __radd__(self, second):
- return self + second
- def __neg__(self):
- return Fraction(self.sign * self.num * (-1), self.denum)
- def __sub__(self, second):
- return self + (-second)
- def __rsub__(self, second):
- pass
- def __lt__(self, second):
- return self.sign * self.num * second.denum < second.sign * self.denum * second.num
- def __eq__(self, second):
- return not (self < second or second < self)
- def __int__(self):
- return self.sign * (self.num // self.denum)
- def __pow__(self, power):
- assert isinstance(power, int), "Дробь возводиться в не в целое число"
- if power >= 0:
- self.num, self.denum = self.denum, self.num
- power *= -1
- return Fraction(self.num ** power, self.denum ** power)
- else:
- return Fraction(self.num ** power, self.denum ** power)
- def __mul__(self, b):
- if isinstance(b, int) or isinstance(b, float):
- b = Fraction(b)
- assert isinstance(b, Fraction), "сложение обьекта класса fraction и обьекта недопустимого типа"
- if isinstance(b, int):
- gcd_int = gcd(b, self.denum)
- if gcd_int > 1:
- return Fraction(self.num * (b // gcd_int), self.denum // gcd_int)
- else:
- return Fraction(self.num * b, self.denum)
- elif isinstance(b, Fraction):
- num = self.num * b.num
- demun = self.denum * b.denum
- return Fraction(num // gcd(num, demun), demun // gcd(num, demun))
- def myFloat(self):
- ans = str((self.num // self.denum)) + "."
- l = {}
- index = 0
- self.num = self.num % self.denum
- l[self.num] = index
- t = False
- while t == False:
- if self.num == 0:
- break
- digit = self.num * 10 // self.denum
- self.num = self.num * 10 - (self.num * 10 // self.denum) * self.denum
- if self.num not in l:
- ans += str(digit)
- index += 1
- l[self.num] = index
- t = False
- else:
- ans += str(digit) + ")"
- ans = ans[:l.get(self.num) + len(ans[:ans.index(".") + 1])] + "(" + ans[l.get(self.num) + len(
- ans[:ans.index(".") + 1]):]
- t = True
- if self.sign == -1:
- return "- " + ans
- return ans
- # print("тест к заданию 5, урока 17")
- # print("3/2^-5")
- # a = Fraction(3, 2)
- # print(a**-5)
- #
- # print()
- # print("дробь 3/0")
- a = Fraction(3, 2)
- print("тест к заданию 5, урока 17")
- print("тест на ад:")
- print("test 1: 5 + 3/2 = ", 5 + a, " (int + fraction)")
- print("test 2: 5.8 + 3/2 = ", 5.8 + a, " (float + fraction)")
- print("test 3: True + 3/2= ", True + a, " (bool + fraction)")
- # print("test 4 (обработка ошибки, str + fraction):", "qwerty" + a)
- print()
- print("тест на mul:")
- print("test 1: 5 * 3/2 = ", a * 5, " (int * fraction)")
- print("test 2: 5.8 * 3/2 = ", a * 5.8, " (float * fraction)")
- print("test 3: True * 3/2= ", a * True, " (bool * fraction)")
- # print("test 4 (обработка ошибки, str * fraction):", "qwerty" * a)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement