python中的分解

时间:2012-07-26 07:51:42

标签: python factorization

此代码工作正常。比如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 ,那么所有具有幂0的素数,我在第31行进行了更改(如果j!= 0: 而不是其他:)。然后代码不起作用。它适用于像13860这样的数字,其中没有素数的幂数为零而不是1980年的数字。我找不到问题! 更改的代码是:

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)

3 个答案:

答案 0 :(得分:2)

我没有分析你的逻辑,但是你错误地使用了else子句。 while .. else仅在您break内拨打while时才有意义。在您的第一个代码示例中,始终执行else分支。

例如,即使以下代码也会运行else分支:

while False:
    print 'while'
else:
    print 'else'

答案 1 :(得分: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]

答案 2 :(得分:0)

要添加到imsc的答案, 实际上有一个算法使用loop = 6和loop + = 6然后尝试循环+ 1和循环-1运行得更好。 2&amp;必须首先手动尝试3。