2013-11-22 31 views
1

我做了一个代码,使用户输入两个分数的形式“d/n”。python分数分数

如何让它打印分数的简化形式?

例如:当我输入2/4时,打印1/2?

import sys 

class Rational: 

    def __init__(self,n,d): 
    self.numerator= n 
    self.denominator= d 
    def value(self): 
    return float(self.numerator)/float(self.denominator) 

    def __repr__(self): 
    return "%d/%d ~ %g" % (self.numerator,self.denominator,self.value()) 
    def read(self): 
    while 1: 
     try: 
     s=raw_input("Enter fraction n/d: ") 
     n,d= s.split("/") 
     self.numerator= int(n) 
     self.denominator= int(d) 
     except KeyboardInterrupt: 
     print 
     exit() 
     except: 
     print sys.exc_info()[0] 
     print "bad input, try again." 
     else: 
     if int(d)==0: 
      print "The denominator cannot be zero. Try again." 
     elif int(d)<0: 
      print "The denominator cannot be negative. Try again." 
     else: 
      return 

r1=Rational(1,1) 
r1.read() 
print r1 

r2=Rational(1,1) 
r2.read() 
print r2 
+1

你知道分数模块的存在吗? – Ant

回答

4

使用fractions.Fraction() class并将它做的工作给你:

>>> import fractions 
>>> fractions.Fraction(2, 4) 
Fraction(1, 2) 

为了自己简化分数,计算最大公约数:

def gcd(a, b): 
    while b: 
     a, b = b, a%b 
    return a 

g = gcd(numerator, denominator) 
numerator //= g 
denominator //= g 
+0

我可以问你为什么'//'而不是单个'/'? – RGS

+1

@RSerrao:分区划分而不是浮点划分(或者在Python 2中,根据操作数的不同,分区*或*浮点划分)。 –

+0

我的观点是,如果你知道g将会是num和den的全部除数,为什么要进行分区?这是好的做法还是无所谓? – RGS

0

简单地划分numeratordenominator到他们的greatest common divisor显示数字之前。那就是如果你想使用你自己的类。否则,在fractions模块中有Fraction类。

0

那么,首先你需要增加对你的Rational类的支持,这个类计算了一个分数的简化形式。基本上,你需要做的是添加一个reduce()方法,它找到Rational中两个分子分母的最小公分母。尝试查看Least Common Multiple的算法。

0
import fractions 

f = fractions.Fraction(5, 10) 
print (f) # print 1/2 
1
>>> num = 2 
    >>> den = 4   
    >>> from fractions import Fraction 
    >>> frac = Fraction(num,den).limit_denominator() 
    >>> numer = frac.numerator 
    >>> denom = frac.denominator 
    >>> print '%d/%d ~ %g' % (numer, denom, float(numer)/denom) 
    1/2 ~ 0.5 

希望这有助于。 (链接http://docs.python.org/2/library/fractions.html