Exemple #1
0
class Rational:
    def __init__(self, str):
        '''Конструктор рационального числа, Васильев Максим'''
        # self.numer - хранит числитель (numerator), self.denom
        # хранит знаменатель (denominant), числа вводятся в виде
        # num/den
        a = str.split('/')
        self.numer = Integer(a[0])
        self.denom = Natural(a[1])

    def __str__(self):
        '''Строковое представление рационального числа, Васильев Максим'''
        # Возвращает строку вида 'num/den'
        return '{}/{}'.format(self.numer, self.denom)

    def __neg__(self):
        '''Умножение дроби на -1, Васильев Максим'''
        # Меняем знак на противоположный у числителя
        a = Rational(str(self))
        a.numer = -a.numer
        # Возвращаем <object Rational>
        return a

    def __gt__(self, oth):
        '''Сравнение двух дробей, Васильев Максим'''
        # Смотрим на знак разности двух дробей, если
        # отрицательный, то дробь больше, иначе меньше
        return (oth - self).numer.negative

    def isZero(self):
        '''Проверка дроби на ноль, Васильев Максим'''
        # Проверяем знаменатель на ноль, уже имеющимся методом
        return self.numer.isZero()

    def __add__(self, oth):
        '''Сложение рациональных чисел, Гусева Екатерина'''
        a = Rational(str(self))
        b = Rational(str(oth))
        # n_den - НОК знаменателей
        n_den = a.denom.lcm(b.denom)
        # Коэффицент на который домножаем первый числитель
        a_k = n_den // a.denom
        # Коэффициент на который домножжаем второй числитель
        b_k = n_den // b.denom
        # Умножаем коэффициенты и числители, знаменатель - НОК
        n_num = a.numer * Integer(str(a_k)) + b.numer * Integer(str(b_k))
        # Возвращаем <object Rational>
        return Rational(str(n_num) + '/' + str(n_den))

    def __sub__(self, oth):
        '''Вычитание рациональных чисел, Васильев Максим'''
        # Аналогично с целыми
        # Возращаем <object Rational>
        return self + -oth

    def __mul__(self, oth):
        '''Умножение рациональных чисел, Гусева Екатерина'''
        # Умножаем числители и знаменатели и сокращаем их
        # Возвращаем <object Rational>
        return Rational(
            str(self.numer * oth.numer) + '/' +
            str(self.denom * oth.denom)).red()

    def isInteger(self):
        '''Проверка, является ли дробь - целым, Васильев Максим'''
        # Проверяем делится ли числитель на знаменатель нацело,
        # остаток от деления - 0
        # Возвращаем <object Bool>
        return (self.numer.ton() % self.denom).isZero()

    def red(self):
        '''Сокращение дроби, Гусева Екатерина'''
        num = self.numer.ton()
        den = self.denom
        # Находим НОД числителя и знаменателя
        gcd = num.gcd(den)
        # Делим числитель и знаменатель на НОД
        self.numer.digits = (num // gcd).digits
        self.denom = den // gcd
        # Возвращаем <object Rational>
        return self

    def abs(self):
        self.numer.negative = False
        return self

    def turn(self):
        '''Получение вида 1/x - для дроби, Васильев Максим'''
        # Числитель становится знаменателем
        # Знаменатель числителем
        n_den = Natural(str(self.numer.abs()))
        n_num = Integer(str(self.denom))
        n_num.negative = self.numer.negative
        # Возвращаем <object Rational>
        return Rational(str(n_num) + '/' + str(n_den))

    def __truediv__(self, oth):
        '''Деление рациональных, Васильев Максим'''
        # Сводим деление к умножению на обратное
        # Возвращаем <object Rational>
        return self * oth.turn()

    def isNegative(self):
        '''Возвращает True если отрицательный, False если положительный'''
        return self.numer.negative

    def toContinued(self):
        '''Дробь в непрерывную, Васильев Максим'''
        a = Natural(str(self.numer.abs()))
        b = Natural(str(self.denom))
        res = ''
        # Применяем алгоритм Евклида к дробям, записываем
        # в res строку вида '1 2 3 4 5' где цифры - остатки
        # от деления
        while not a.isZero() and not b.isZero():
            if a > b:
                res += str(a // b) + ' '
                a = a % b
            else:
                res += str(b // a) + ' '
                b = b % a
        # Вызываем функцию которая возвращает красивое представление
        # непрерывной дроби
        # Возвращает <object String>
        return contForm(res)

    def toi(self):
        '''Преобразование в целое рационального, Васильев Максим'''
        self.red()
        # Если знаменатель после сокращения равен 1 - то число целое
        if self.denom == Natural('1'):
            # Возвращаем <object Integer>
            return Integer(str(self.numer))
        return self
Exemple #2
0
 def division(a):
     a1 = Integer(str(a))
     text = '|'+ a + '| = ' + str(Integer.abs(a1))
     return text