1

このコードは正常に動作しています。1980年の場合、結果は2 ^ 2 *3 ^ 2 *5 ^ 1 *7 ^ 0 *11 ^ 1 * (余分なアスタリスクが最後に残ります。削除できます。それは私の問題とは何の関係もありません。コードは次のとおりです。

prime=[2,3,5]
f=7
def next_prime(f):
    j=0
    while j==0:
        for x in prime:
            if f%x==0:
                f+=2
                break
        else:
            j=1
    return f;
def factorization(n):
    list=[2,3,5]
    power=[]
    x=0
    while x<len(list):
        j=0
        while n%list[x]==0:
            j+=1
            n=n/list[x]
        power.append(j)
        x+=1
    if n!=1:
        while n!=1:
            g=next_prime(f)
            j=0
            while n%g==0:
                j+=1
                n=n/g
            else:
                power.append(j)
                prime.append(g)
    x=0
    while x<len(power):
        print(prime[x],"^",power[x],"*",end="")
        x+=1

factorization(1980)

次に、結果から項7 ^ 0を削除したい場合、したがって、べき乗がゼロのすべての素数を削除したい場合は、31 行目で変更を行いました ( if j!=0:の代わりにelse: )。そして、コードが機能しません。1980 のような数ではなく、素数の累乗がゼロでない 13860 のような数で機能します。問題が見つかりません! 変更されたコードは次のとおりです。

prime=[2,3,5]
f=7
def next_prime(f):
    j=0
    while j==0:
        for x in prime:
            if f%x==0:
                f+=2
                break
        else:
            j=1
    return f;
def factorization(n):
    list=[2,3,5]
    power=[]
    x=0
    while x<len(list):
        j=0
        while n%list[x]==0:
            j+=1
            n=n/list[x]
        power.append(j)
        x+=1
    if n!=1:
        while n!=1:
            g=next_prime(f)
            j=0
            while n%g==0:
                j+=1
                n=n/g
            if j!=0:
                power.append(j)
                prime.append(g)
    x=0
    while x<len(power):
        print(prime[x],"^",power[x],"*",end="")
        x+=1

factorization(1980)
4

3 に答える 3

2

私はあなたの論理を分析していませんが、else節の使い方が間違っています。while .. else内で a を呼び出す場合にのみ意味がbreakありますwhile。最初のコード サンプルでは、else​​ブランチは常に実行されます。

例として、次のコードでもelseブランチが実行されます。

while False:
    print 'while'
else:
    print 'else'
于 2012-07-26T08:17:57.000 に答える
1

数値の素因数を取得することのみに関心がある場合は、次を試すことができます。

def primefactors(x):
    factorlist=[]
    loop=2
    while loop<=x:
        if x%loop==0:
            x/=loop
            factorlist.append(loop)
        else:
            loop+=1
    return factorlist

例えば:

primefactors(1980)
[2, 2, 3, 3, 5, 11]
primefactors(13860)
[2, 2, 3, 3, 5, 7, 11]
于 2012-07-26T08:14:49.757 に答える
0

imsc の回答に追加すると、実際には loop =6 と loop +=6 を使用してから loop+1 と loop-1 を試行するアルゴリズムがあり、これは少しうまく動作します。ただし、2 と 3 は最初に手動で試す必要があります。

于 2012-07-27T18:40:32.423 に答える