2013-09-26 4 views
1

Я работаю над вопросом в python, который занимается рациональными числами, и у него есть способ, который упрощает его. Например, 12/8 дает 3/2. Я задал этот вопрос и получил правильный ответ, но я это сделал, найдя gcd числителя и знаменателя. Может кто-то поможет сделать это, используя некоторые встроенные специальные функции или функции python, модули или что-то уникальное для python, как вы говорите «Пути-Пути!».Упрощение рационального числа с использованием python

Существует ли такой способ или любые тестовые примеры, чтобы охватить все возможности?

Вот мой код:

class RationalNumber: 
def __init__(self, n, d=1): 
    self.n=n 
    self.d=d 

'''def gcd(self, a, b): // I have taken out gcd by two methods: recursion and while loop 
    if b>a: 
     t=a 
     a=b 
     b=t 

    while a%b != 0: 
     r=a%b 
     a=b 
     b=r 

    return b 
    ''' 

def gcd(self, a, b): 
    if a%b==0: 
     return b 
    else: 
     return self.gcd(b, a%b) 

def simplify(self): 
    x=self.gcd(self.n, self.d) 
    self.n=self.n/x 
    self.d=self.d/x 

    return RationalNumber(self.n, self.d) 

def __str__(self): 
    print "%s/%s"%(self.n, self.d) 

r1 = RationalNumber(12,8) 
print r1.simplify() 

При запуске программы она дает ответ и дает ошибку:

Traceback (most recent call last): 
    File "C:\Python27\CTE Python Practise\New folder\RationalNumberSimplify.py", line 42, in <module> 
    print r1.simplify() 
TypeError: __str__ returned non-string (type NoneType) 

Пожалуйста, помогите мне удаления ошибки и улучшения кода и делает его больше питонов!

+0

Все функции внутри класса извините за неправильно отступов – user2696258

+0

Вы должны использовать пробелы для отступов, а не вкладки – stranac

+0

Хотя у вас есть законный вопрос здесь, точка этот сайт НЕ «улучшает код», «помогает сделать программу более эффективной». Проверьте FAQ и в следующий раз задайте один вопрос. – Hooked

ответ

1

Используйте модуль фракции, упомянутый @stranac. Что касается другого вопроса о вашей ошибке, она может быть исправлена ​​путем замены методы __str__ с

def __repr__(self): 
    return "%s/%s"%(self.n, self.d) 

Для либо, __str__ или __repr__ вам необходимо возвращать строку не просто распечатать его. Это может быть полезно, чтобы посмотреть на вопрос:

Difference between __str__ and __repr__ in Python

+0

Даже когда я изменил функцию str(): def __repr __ (self): print "% s /% s"% (self.n, self.d), то также я получаю ту же ошибку, что я делаю? пожалуйста помоги?? – user2696258

+0

Обратите внимание на разницу - я звоню ** возврат ** вы вызываете ** печать **. Метод '__str__' или' __repr__' _ хочет вернуть что-то! – Hooked

5

Для этого существует более питонический способ.

fractions module имеет функцию gcd(), но вам, скорее всего, это не понадобится, так как класс фракций должен делать все, что вам нужно.

>>> import fractions 
>>> print fractions.Fraction(12, 18) 
2/3 
+0

Не знаю, что я знаю, и документы, кажется, ничего не упоминают – stranac

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