2011-12-01 90 views
1

下面的代碼不斷告訴我一個錯誤的數字,我不明白爲什麼,知道這是蠻力,但它應該仍然有效......它返回的數字的確超過了500個因子,確切地說512,幫助將是非常感謝euler挑戰12,爲什麼這個python代碼失敗?

Number = 1 
Count = 2 
Found = False 
while Found == False: 
    Divisors = 0 
    if (Number % 2) != 0: 
     for i in range(1, int(Number**(1/2)), 2): 
      if Number % i == 0: 
       Divisors += 1 

    else: 
     for i in range(1, int(Number**(1/2))): 
      if Number % i == 0: 
       Divisors += 1 

    if Divisors >= 500: 
     print (Number) 
     Found = True 

    else: 
     Number += Count 
     Count += 1 

參考:Problem 12 from the Euler Challange

+1

我認爲,即使按照您的意圖工作,您將會遇到問題。因爲你的數字是1到1/2,所以你不會把數字本身作爲除數。這可能不會影響你的答案,但我想你想知道。如果我在這裏,請告訴我,我不熟悉python。 – Toast

回答

3

的整數的除數的數量僅僅是一個整數的因數分解各純功率的(1 +指數)產物。

作爲一個例子:28 = 2^2 * 7

的權力爲2和1,因此除數的數目是(2+1)*(1+1) = 3*2 = 6。易一個

更大之一:2047 * 2048/2 = 2^10 * 23 * 89

的權力,10,1和1,所以除數的數目爲11*2*2 = 44

更容易:100 = 2^2 * 5^2

權力是2,2所以有3*3=9除數。這同樣適用於36=2^2*3^2。唯一有趣的部分是指數。

因此,使用任何素因子分解(使用篩子,你不需要一個素性測試),它將比嘗試每個可能的數字更快更可靠。

def factorize(i): 
    # returns an array of prime factors 
    whatever 

def number_of_divisors(i): 
    n = 1 
    for v in Counter(factorize(i)).values(): 
     n *= v + 1 
    return n 
2

我不知道什麼歐拉挑戰12,但一個明顯的問題是(1/2)。如果你嘗試在Python提示符下輸入,你會得到0.之所以會嘗試做整數運算。我建議只是放(0.5),或者你可以做(​​1/2.0)。

+0

這取決於這是Python 2.x還是3.x.請參閱http://www.python.org/dev/peps/pep-0238/和http://docs.python.org/release/3.0.1/whatsnew/3.0.html#integers – sberry

+0

這是一個很好的觀點。我還沒有過渡,所以只有在第二次之前纔會發生。 –

+0

數字**(1/2)在python 3.x中正常工作,我使用 – Daquicker

2

您的除數計數方法是錯誤的。 12有6個約數,但你的代碼只計算2.

問題:

  1. 一些往往有除數比其平方根較大
  2. 範圍不包括它的上限,所以你停藥太早
+0

只有去平方根的範圍肯定是一個問題。也許OP的意思是做'數字*(1.0/2)'而不是'**' – sberry

+1

@ sberry2A我懷疑OP做了一個不同的錯誤,只有在平方根上修改很小。 (沒有明確的更正,不會破壞問題。) –

1

你的代碼已經寫是搜索,直到數** 0.5,這是錯誤的,你必須尋找到數/ 2 所以修正答案是象下面這樣:

注:我添加了一些額外的代碼來顯示進度。而且它們不會影響解決方案。

另注:自2-14本身不計入像問題的例子,我加一次執行。

Number = 1 
Count = 2 
Found = False 
big_Devisor = 0 
print "Number Count Divisors" 
while Found == False: 
    Divisors = 1 # because the Number is itself Devisor 
    if (Number % 2) != 0: 
     for i in range(1, int(Number/2), 2): 
      if Number % i == 0: 
       Divisors += 1 
    else: 
     for i in range(1, int(Number/2)): 
      if Number % i == 0: 
       Divisors += 1 

    if Divisors >= 500: 
     print (Number) 
     Found = True 

    else: 
     if Divisors > big_Devisor: 
      big_Devisor = Divisors 
      print Number,'\t', Count, '\t', Divisors 
     Number += Count 
     Count += 1