2012-04-10 110 views
1

現在、問題の解決に挑戦しています。1から20までのすべての数値で均等に割り切れる最小の正の数値は何ですか? '1から20の間のすべての整数で割り切れる最小の数を見つけるコードを最適化する

これまでのところ、私は動作すると思われるものをコーディングしましたが、非常に長い時間がかかります。さらに、私は膨大な量の 'と'の文をifに入れなければなりません。これは非常に効率的でもプロフェッショナルでもないようです。

このコードを最適化し、おそらくそれをもっと細かくするために、私は何ができますか?

number = 1 
result = 0 

def divide(candidate): 
    if candidate % 2 == 0 and candidate % 3 == 0 and candidate % 4 == 0 and candidate % 5 == 0 and candidate % 6 == 0 and candidate % 7 == 0 and candidate % 8 == 0 and candidate % 9 == 0 and candidate % 10 == 0 and candidate % 11 == 0 and candidate % 12 == 0 and candidate % 13 == 0 and candidate % 14 == 0 and candidate % 15 == 0 and candidate % 16 == 0 and candidate % 17 == 0 and candidate % 18 == 0 and candidate % 19 == 0 and candidate % 20 == 0: 
     global result 
     result = 1 
     return 1 

    else: 
     global number 
     result = 0 
     number = number + 1 
     return 0 

while result == 0: 
divide(number) 

print "The lowest number divisible by all integers between 1-20 is:", number 

だけ明確にする、これは宿題ではない、私は、Python自身の自己教育だとその一環として、いくつかのプロジェクト・オイラーの問題をしようとしています。

+0

この宿題はありますか?ヒント:本当に1と20の間のすべての数値で割り切れをチェックする必要がありますか?数字が2と3で割り切れる場合、1と20の間の他の数字はどれですか? –

+0

これは宿題ではなく、私は自分の学者の外でPythonを自己教えるだけです。そして良い点、よかった! – c3ntury

+2

あなたは "最小公倍数"のためのグーグルに興味があるかもしれません。 – DSM

答えて

0

ここでは非常に単純ですが非常に効率的です。素数とその威力しか使用しないでください。どうして彼らの倍数を考慮する必要がありますか? "and"条件を4,9,16,5,7,11,13,17,19に減らす

+0

注意:あなたが2で割り切れるからといって、 4または8または16で割り切ってください。 – DSM

+0

あなたの思い出に感謝、私は私の答えを更新しました –

+0

両方のあなたに感謝:) – c3ntury

2

前の数値の要素である数値を削除することから始めてください。 4で割り切れるすべての数字は2で割り切れる。10で割り切れるすべての数字は5で割り切れ、9で割り切れるすべての数字は3で割り切れる。

+0

ありがとう、私はすぐに反映するために私のコードを変更します。 15歳以上でそれをする方法はありますか? – c3ntury

+0

@ c3ntury - すべての数字をリストに入れてから、リストを反復してそれぞれをテストします。 – bta

0

私は 'mod' %)は素数です。私は1から20までのすべての数字を使用しません。

9

あなたの問題は、コンピュータの助けなしに簡単に解決できるので、最適化されたバージョンは単純に答えを出力します。許容されると思われる最適化の量を教えてください。

コンピュータなしでこの問題を解決する方法は次のとおりです。 1から20までのすべての数で割り切れる最小の数は、これらの数の間に発生するすべての素数によって割り切れるものでなければなりません。一方、この範囲内のすべてのプライム・パワーで割り切れる数があれば、それは1から20までのすべての数で割り切れるでしょう。異なるベースを持つプライム・パワーは共起しているので、すべての最高プライム・パワーこの範囲の各素数が答えになります。最適化コードは次のとおりです。

print 2**4 * 3**2 * 5 * 7 * 11 * 13 * 17 * 19 
+0

うわー、それは本当に最適化されています!私が全く理解していないことは、「各プライムの最高プライムパワー」と言うときです:/ – c3ntury

+1

@ c3ntury: "プライム1〜20の各プライムに対して、このプライムの最高パワーを取るこの範囲で発生します。 –

+0

ああ、あなたは2 ** 4を持っています。なぜなら、それは16と3 ** 2と等しいからです。なぜなら、それは9に等しいからでしょうか?なぜあなたは16と9を入れないのですか? :s – c3ntury

関連する問題