2013-01-09 116 views
1
def gei(a, b): 
    ''' 
    a, b: only positive integers! If you don't, we will make you. Max 1337 
    For extracting the juice of the numbers in the form of a common divider 
    ''' 
    #Not Ruby, no to_i, but int() 
    smallest = int(abs(min(a, b))) 
    biggest = int(abs(max(a, b))) 
    print "You inputed: ", smallest, " and ", biggest, " their order doesn't matter." 
    print "Do you want to see guess numbers? Type 'yes', if you do! " 
    selection = raw_input() 
    print 
    print 
    #To evade infinite loops and too big numbers, we use count. 
    count = 0 
    ans = smallest 
    truth = str(selection) == str('yes') 
    def condition(ans, base): 
     ans1 = base % ans == 0 
     return ans1 
    while condition(ans, biggest) == False or condition(ans, smallest) == False: 
     ans -= 1 
     count += 1 
    if count >= 1337: 
     break 
    elif truth == True: 
     print ans 
    if truth == True: 
     print 
     print 
    print "After weeks of calculation, here is your greater common divider: " 
    return ans 

所以是,8年級的信息學作業,以提取常見的更大的分隔符。我想知道,也許你們知道我該如何讓它不那麼麻煩?如何避免使用內部定義並命名如此多的變量?找到最大公約約

回答

7
import fractions 
print fractions.gcd(4,8) 
>>> 4 

但你也可以看看源:

def gcd(a, b): 
    """Calculate the Greatest Common Divisor of a and b. 

    Unless b==0, the result will have the same sign as b (so that when 
    b is divided by it, the result comes out positive). 
    """ 
    while b: 
     a, b = b, a%b 
    return a 

參考:http://en.wikipedia.org/wiki/Euclidean_algorithm

+0

是好的和簡單 – rikAtee

-1

這是很好的一個consise和名稱沒有變:

def gcd(a,b): 
    return max(d for d in xrange(1, min(a, b)+1) if a % d == b % d == 0) 

print gcd(15, 25) 

>>> 5 

但請不要聲稱這是自己:)

+0

當然,也有更高效的算法:) – Ber

0

在代碼中可以改進一些東西。

首先,truth是一個真正差的變量名稱,因爲它並不真正告訴你它的內容是什麼意思。我會使用類似show_work的東西。

接下來,你有一個內部函數告訴你一個變量平均分配另一個(返回一個布爾值)。我建議直接使用模數值,而不是將它轉換爲== 0的布爾值,而且你也不需要它在函數中。此外,沒有必要比較TrueFalse的值。只需使用該值本身(或使用not將其反轉)。把它們放在一起會使你的while循環的條件not biggest % ans and not smallest % ans

最後,您可以使用比逐一嘗試每個值更好的算法。 Euclid's algorithm是快速計算最大公約數的好方法,並且在Python中實現起來非常簡單(但我會留給你看)。

1

使用Euclid算法

int GCD(int a,int b){ 
if(b==0){ 
      return a; 
} 
return GCD(b,a%b);   
}