2015-04-07 2 views
-2
# Rational numbers 

def gcd(bigger, smaller): 
    '''compute the greatest common divisor of two positive integers''' 
    #print(' in gcd ') 
    if not bigger > smaller : 
     bigger, smaller = smaller, bigger 
    while smaller != 0: 
     remainder = bigger % smaller 
     #print('gcd calc, big:{}, small:{}, rem:{}'.format(bigger, smaller, remainder)) 
     bigger, smaller = smaller, remainder 
    return bigger 

def lcm(a, b): 
    '''calculate the least common multiple of two positive integers''' 
    #print(' in lcm ') 
    return (a*b)//gcd(a,b) 


class Rational(object): 
    '''Rational with numerator and denominator. Denominator defaults to 1''' 

    def __init__(self, numer, denom = 1): 
     #print('in constructor') 
     self.numer = numer 
     self.denom = denom 

    def __str__(self): 
     '''String representation for printing''' 
     #print(' in str ') 
     return str(self.numer) + '/' + str(self.denom) 

    def __repr__(self): 
     ''' Used in the interpreter. Call __str__ for now''' 
     print(' in repr ') 
     return self.__str__() 

    def __add__(self, param_Rational): 
     '''Add two Rationals''' 
     if type(param_Rational) == int: 
      param_Rational = Rational(param_Rational) 
     if type(param_Rational) == Rational: 
      # find the lcm 
      the_lcm = lcm(self.denom, param_Rational.denom) 
      # multiply each numerator by the lcm, then add 
      numerator_sum = the_lcm*self.numer/self.denom + \ 
         the_lcm*param_Rational.numer/param_Rational.denom 
      return Rational(int(numerator_sum), the_lcm) 
     else: 
      print("Wrong type in addition method.") 
      raise(TypeError) 

    def __sub__(self, param_Rational): 
     '''Subtract two Rationals''' 
     #print(' in add ') 
     # find the lcm 
     the_lcm = lcm(self.denom, param_Rational.denom) 
     # multiply each numerator by the lcm, then add 
     numerator_sum = the_lcm*self.numer/self.denom - \ 
        the_lcm*param_Rational.numer/param_Rational.denom 
     return Rational(int(numerator_sum), the_lcm) 

    def reduce_rational(self): 
     '''Return the reduced fraction value as a Rational''' 
     # find the gcd and divide numerator and denominator by it 
     the_gcd = gcd(self.numer, self.denom) 
     return Rational(self.numer//the_gcd, self.denom//the_gcd) 

    def __eq__(self, param_Rational): 
     '''Compare two Rationals for equalit and return a Boolean''' 
     reduced_self = self.reduce_rational() 
     reduced_param = param_Rational.reduce_rational() 
     return reduced_self.numer == reduced_param.numer and\ 
       reduced_self.denom == reduced_param.denom 

Как я могу назвать метод sub и add для добавления/вычитания двух рациональных чисел?Как использовать метод в python

+3

Что случилось с 'печати Rational (5,2) - рациональное (1,3)'? – Selcuk

+1

Также есть модуль 'fractions' – dhke

ответ

2

Вы их не называете. Python называет их для вас, когда вы вычитаете Rationals с помощью - или добавляете их с +. То есть в @ примере SELÇUK в:

print Rational(5,2) - Rational(1,3) 

Это будет вызывать __sub__()

Смежные вопросы