2015-04-24 39 views
0

我試圖找到前20個自然數(項目歐拉問題5)的LCM。對於這一點,我的算法是:Python:根據條件劃分列表中的元素

  1. 在列表
  2. 鴻溝僅是整除其中i的範圍是從(2-20)的那些列表中元素有數字1至20。
  3. 無論列表中剩下的數字是多少,它們就是lcm。

這是我們實際用來第一次在學校計算lcm的最天真的算法。

現在,我不知道如何根據條件劃分列表的元素。 我曾嘗試過:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
for x in a: 
    if(x%2==0): 
     x=x/2 

這似乎不起作用。 我也試過:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
a1=[if(x%2==0): x/2 for x in a] 

在上面既沒有「:」如果條件之後。這不起作用。我有以下問題:

a。爲什麼第一個循環不能正常工作?

b。有人能告訴我如何做到這一點?

c。我的算法能正常工作嗎?

+0

你預期的產量是多少? – Kasramvd

+0

@ kasra-他只是整個項目的一部分。我打算通過素數分解得到20個數字中的1cm。 – kpks

+0

本質上你不需要素因子分解,但是你必須注意計算因子的次數,只需要考慮它們的次數(參見下面的答案)。 – juandesant

回答

0

一)變量x取列表a的價值,但不能修改,它不是列表的參考,下面的代碼你想要做什麼:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
for i in range(len(a)): 
    if(a[i]%2==0): 
    a[i]=a[i]/2 

B)ŸC)

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 

def f(x): 
    if(x%2==0): 
    return x/2 
    return x 

a1=[f(x) for x in a] 

無論數量都留在了名單,乘他們,這將是LCM。

reduce(lambda x, y: x*y, a1) 
+0

非常感謝!這工作:) – kpks

+0

@kpks隨意標記此答案爲正確:) –

+0

@Jose Done .. :) – kpks

1

一個。爲什麼第一個循環不能正常工作?

出於同樣的原因爲:

灣有人能告訴我如何做到這一點?

您可以執行:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
for i, x in enumerate(a): 
    if x%2==0: 
     a[i]=x/2 

或者:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
a1=[x/2 if x%2==0 else x for x in a] 

℃。我的算法能正常工作嗎?

我不這麼認爲。你會最終通過自身分裂大家,結果始終爲1

但這裏有其他問題的,這樣有簡單的答案,如:

find least common multiple of numbers 1-20

1

一)爲什麼這個循環無法正常工作?

作爲@聖何塞-裏卡多-Bustos的-m表示,所述x不是引用,是一個本地副本到陣列a的每個元素,並且不能修改陣列中的for循環。您可以使用,而不是:

a=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
for i,x in enumerate(a): #used to provide a value, and an index 
    if(x%2==0): 
     a[i]=x/2 

B)誰能告訴我,我該怎麼辦呢?

你可以嘗試使用三元如果運營商和列表理解:

a = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
b = [x/2 if x%2==0 else x for x in a] 

C)時,我的算法正常工作

你要跟蹤的數字您已經使用,而且您可能需要多次劃分相同的數字。但是,如果你這樣做,並繼續分割相同的數字_直到結果列表等於前一個,然後移動到下一個,你可以稍後乘以所有使用的數字,乘以列表的其餘部分(但如果你去到列表中的最大數量,剩下的列表將只包含1)。

def f(l,n): # divides items in a which are divisible by n, or leaves them 
    return [x/n if x%n==0 else x for x in l] 

lcm = 1 
a=[2,3,4,5,6,7] 

# we go from the smallest to the largest number in your list 
for i in range(2,max(a)+1): 
    repeat_next_time = True 
    while repeat_next_time: 
     b = f(a,i) 
     if a != b: 
      print('Using %s as a factor' % i) 
      a = b 
      lcm *= i 
      # print(a) # to get the status of the a list 
     else: 
      repeat_next_time = False 
# finally, for numbers which might have not been divided yet, 
# multiply the lcm by all of the remaining items 
lcm *= reduce(lambda x,y: x*y, a) 

即使在列表中有共同的因子或重複的數字,它也能正常工作。例如,嘗試使用a = [2,2,2]a = [2,3,6]a = [8,7,4,7]

+0

如果你使用'a = range(2,20 + 1) )',你得到你的問題的實際答案:'lcm = 232792560'。你可以用Wolfram Alpha檢查它:http://www.wolframalpha.com/input/?I =至少%20common%20multiple%20of%202%2C3 2C4%%2C5 2C6%%2C7 2C8%2C9%2C10%2C11%%2C12%2C13 2C14%%2C15%2C16%2C17%2C18%2C19%2C20 – juandesant

相關問題