0

私は初心者プログラマーです。素因数を数値から取り出して印刷する簡単なプログラムを作成することにしましたが、最終結果を印刷するのに問題があります。コードは次のとおりです。

n = int(raw_input("Number?: "))
m = n
k = 2
czynniki = []       

while(m != 1):
    if m%k == 0:
        czynniki.append(k)
        print m, "\t", '|', k
        m = m/k
    else:
        k+=1
print m

print n, ' = ',
for czynnik in czynniki:
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        czynniki = filter(lambda x: x!=czynnik, czynniki)
    else:
        print czynnik, ' *',

最後まですべて大丈夫です。たとえば、1025が入力されたときに「1025 = 5 ^ 2 * 41」を出力したいのですが、代わりに、フィルター機能がまったく影響を与えなかったかのように「1025 = 5 ^ 2 * 5*41」を出力します。バグはどこにありますか?

4

3 に答える 3

2

問題は、リストczynnikiを反復しながらリストを変更していることです。代わりにこれを試してください:

print n, ' = ',
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), '*',
    else:
        print czynnik, '*',

ここでは、リストの一意のアイテムのみの別のリストを反復処理しますczynniki。これは、リストをセット (一意のアイテムのソートされていないリスト) にキャストしてから、ソートされたリストに戻すことによって実現されます。

最後にその余剰を取り除きたい場合は*、これを試すことができます:

result_list = []
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        result_list.append(str(czynnik) + '^' + str(czynniki.count(czynnik)))
    else:
        result_list.append(str(czynnik))
print n, '=', ' * '.join(result_list)
于 2012-09-08T11:24:44.267 に答える
1

forに格納されているリストに対してループを開始czynnikiします。後でczynniki、ループするリストを変更しない参照(まったく新しいリスト)を変更しforます。ループが実行されている実際のリストを変更することも安全ではないため、どちらの方法でも実際には変更できません。

ループを次のように書き直したい場合があります。代わりに重複する値をスキップし、実行中にループを変更しようとしないでください。

var lastvalue = -1;
for czynnik in czynniki:
    if lastvalue == czynnik:
        continue
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        lastvalue = czynnik
    else:
        print czynnik, ' *',
于 2012-09-08T11:18:15.197 に答える
0

オーバーしようとしているコレクションをフィルタリングする代わりに、ループ内のいくつかのアイテムをスキップしたい場合は、continue キーワードを使用する必要があります。

于 2012-09-08T11:11:28.460 に答える