此代码工作正常。比如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)
答案 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。