打破数字到素数 - 为什么这段代码永远不会停止?

时间:2014-10-04 10:24:13

标签: python primes

def breaktoprimes(x):
    primefactors = []
    if x==1:
        primefactors.append(1)
    y=1
    while y<=x or x!=1:
        if(x%y==0):
            primefactors.append(y)
            x=x/y
            y=1
        else:
            y=y+1
    return primefactors

所以基本上我要做的就是填写清单&#34; primefactors&#34;与x的素因子。但是,无论我输入什么,代码只会运行并运行,并在一段时间后返回此错误:

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    breaktoprimes(15)
  File "<pyshell#35>", line 8, in breaktoprimes
    primefactors.append(y)
MemoryError

基本上我想要的代码是:

  1. 虽然y小于或等于x,而x不等于1,除非输入的数字小于1或x除以自身,否则它应始终适用,在任何一种情况下我们都会完成,我们继续

    1. 测试x乘y的除法是否导致余数为0.如果是,则y肯定是x的素因子,因为y不大于x,y不能是乘法因为我们已经测试了较小的数字,所以我们已经测试了这个数字。
    2. 如果这样做不起作用,我们将y的值加1,然后重试
  2. 我在网上搜索过,但我发现这个问题的解决方案非常不同,所以我没有找到任何帮助。我不知道这段代码中的问题在哪里。我是c#background的python的初学者,现在编写了大约一年。

    感谢阅读!

4 个答案:

答案 0 :(得分:3)

  1. 所有数字均可被1整除。选择1作为y的初始值并不是一个好选择。
  2. 重置y1应该消失(同样的理由为1)

  3. def breaktoprimes(x):
        primefactors = []
        if x == 1:
            primefactors.append(1)
        y = 2
        while y <= x or x != 1:
            if x % y == 0:
                primefactors.append(y)
                x = x / y
            else:
                y = y + 1
        return primefactors
    

答案 1 :(得分:2)

如果x=1y=1然后y<=x or x!=1为真,x=x/yx设为1,那么x和{{1}将继续为1,循环将永远运行。

答案 2 :(得分:0)

在这部分代码中:

y=1
while y<=x or x!=1:
    if(x%y==0):
        primefactors.append(y)
        x=x/y
        y=1

x%y0。然后y再次成为1。循环继续。

答案 3 :(得分:0)

问题是你的x和y值总是保持不变。因此,您的代码将以无限循环运行。