2016-08-09 3 views
0
def divisible(a): 

    d = 0 
    n = len(a) 
    i = 0 
    p = 0 
    while d == 0 and p < n and i < n: 
     if a[i] % a[p] != 0: 
      i = i + 1 
      p = 0 
     else: 
      p = p + 1 

    return d 

a = [12, 4, 6] 
r = divisible(a) 
print(r) 

誰かが私を助けることができますか?それはpython 3.0 +です。私はこの質問を解決することはできません、私はどこに私は関数にdを入れることができるかわかりません。 a [i]が他のすべての整数で均等に割り切れる場合、let d = a [i]のようになります。答えはこの質問12、誰も私のコードplseaseをimporveすることができますか?ありがとうございました!!整数リスト内の他のすべての整数で均等に割り切れる最初の整数を決定する

+0

'gcd()'関数の使用を許可されていますか?これはあなたのリストの多くのまたは大きい数の方がずっと速いでしょう。 –

+0

gcd()関数を使用することはできません。私は忘れてしまいました。ありがとうございます – armchannelpatrick

+0

あなたは簡単な答え(あなたのものに似ています)または効率的な答え(これは簡単な 'lcm()'と 'gcd()'関数をコードします:彼らは難しいことではありません)を探していますか? –

答えて

2

短いソリューションは、

def divisible(a): 
    for i in a: 
     if all(i%j==0 for j in a): 
      return i 
    return None 

または少し長く

def divisible(a): 
    for i in a: 
     found=True 
     for j in a: 
      if i%j: # everything that is not 0 is true 
       found=False 
       break 
     if found: 
      return i 
    return None 
+0

私はall()を使うことができません。他にi%j == 0を確実にする方法はありますか?ありがとうございました。 – armchannelpatrick

+0

は 'all 'といっしょに長い解決法を追加しました – janbrohl

0

だろう、私はのpython3で、あなたがこのようにそれをコーディングすることができ、あなたは最小公倍数アルゴリズムを探していると思う:

from fractions import gcd 
from functools import reduce 


def lcm(*args): 
    return reduce(lambda a, b: a * b // gcd(a, b), args) 

print lcm(4, 6, 12) 

しかし、あなたのアルゴリズムでは、関数やpython組み込み演算子を使用できないようですeの教育目的。次に、可能な単純な解決策の1つは、次のようになります。

def divisible(input_list): 
    result = None 

    if 0 in input_list: 
     return result 

    for i in input_list: 
     ok = True 
     for j in input_list: 
      if i!=j and i % j != 0: 
       ok = False 
       break 

     if ok: 
      return i 

    return result 
+1

@xgord:あなたはgcdとlcmを混同しています。 10と4のlcmは20ですが、10と4のgcdは2です。このコードはlcmを検索しますが、OPが望ましくないgcd()関数を使用します。OPは、この回答が掲載された後にその要件を追加したので、OPの完全性の欠如についてBPLを処罰しないでください。 OPはまた、lcmがリストの項目になることを望んでいるが、彼はひどくそれを述べている。 –

+0

@armchannelpatrickさんがこの仕事をしていますか? – BPL

0

私は前のコメントに費やしました。すでに複数の倍数を計算する必要はありません。すでにリストに含まれていると考えます。トリックは、最大値(または負の数が許される場合は最小値)をとり、次に検証します。

まず最初に、0をどのように扱うのかを理解してください。他のすべての整数で割り切れるので、それ自体は整数を分けることができないので、この例では0を返します。

また、正解がないと判断した場合は、どうするかを決定します。私はNoneを返しましたが、アプリケーションによっては例外がより適切かもしれません。

def divisible(input_list): 
    # what to do with zero? 
    if 0 in input_list: 
     return 0 
    # get largest magnitude 
    candidate = max(map(abs, input_list)) 
    # validate 
    if all([0 == candidate % x for x in input_list]): 
     return candidate 
    else: 
     # handle the case where there is no valid answer 
     return None 

print divisible([12, 4, 6]) 
print divisible([-12, 4, 6, -3]) 
print divisible([12, 5, 7]) 
print divisible([12, 0, 4]) 

これはjanbrohlの答えにいくつかの類似性を持っているが、それは他のすべての番号に対するすべての番号を確認し、O(N ** 2)ソリューションです。しかし、私たちが望む数字が(規模で)最大になることはわかっています。

矛盾による証明:<bの2つの正の数[a、b]を取り、aをbで割り切れるとします。しかし、%b == 0. <b以降、%bはaであることがわかります。したがって、a = 0またはa = nb(一部のnの場合)。しかし、< b、したがってa == 0。 (自分自身で符号付き整数に展開してください)。

+0

ありがとうございますが、私はall()を使うことができません。同じことをする他の方法はありますか? – armchannelpatrick

+0

あなたは何ですか?すべてを使うことはできませんか?クラスの割り当て? max()を使用できますか?もしそうなら、私はあなたに正しい方向を指していると感じ、それ以上のことは長期的にはより有害であると言います。 –

+0

最終試験の練習問題です。私は4時間後に試験に行くつもりです。あなたに感謝します! – armchannelpatrick

関連する問題