2013-07-29 40 views
1

我正在编写我自己的Rational类版本,我想递归地使用最大公约数。我需要考虑负数 - 虽然我总是想在分子中表示我的负数,尽管让我们说num = 1和denom = -2,我想要将它表示为num = -1和denom = 2并且如果num = -1和denom = -2,则num = 1和denom = 2。我知道我需要使用abs函数来查找gcd,但是如果我删除负号以找到gcd,我需要将它放回...这是我迄今为止的...负数的Python gcd

def gcd(a,b): 

    '''Greatest common divisor function 
    (a and b are integers)''' 
    if b==0: 
     return a 
    else: 
     return gcd(b,a%b) 

class Rational: 

    def __init__(self,a=0,b=1): 

     '''Constructor for Rational''' 
     if b==0: 
      return 'Denominator cannot be zero.' 
     else: 
      g=gcd(abs((a,b)) 
      self.n=a/g  
      self.d=b/g 
      # I need to 'undo' the abs to get my self.n and self.d- 
       if that makes sense!! 
+0

实际上,有没有必要为'呼叫abs'在此代码的任何地方:你'gcd'功能已经与相同的符号'B'返回的东西(假设'b '非零),所以简单地用分母和分母除以'gcd(a,b)'总会给你一个正分母。 –

回答

2

你可以做

self.n = abs(a/g) 
self.m = abs(b/g) 
if a*b < 0: # i.e. signs are different 
    self.n = -self.n