这段代码中找到素数分解有什么问题

问题描述

我尝试使用此代码找到质因数分解,但程序进入了无限循环。 我试图弄清楚是什么让程序进入这个无限循环,但不幸的是我不能。 代码是:

N = int(input())
B = N
L = []
while B != 1:
    for i in range(2,N):
        if N % i ==0:
            L.append(i)
            B = N // i
            break
    else:
        L.append(N)
        B = 1
L.pop()
print(L)

解决方法

问题在于 break 语句,每次当 for 循环开始并达到条件 if N % i ==0 时,都会强制开始一个新的 for 循环,这会创建一个无限循环。所以你要做的就是删除 break

N = int(input())
B = N
L = []
while B != 1:
    for i in range(2,N):
        if N % i ==0:
            L.append(i)
            B = N // i
    else:
        L.append(N)
        B = 1
L.pop()
print(L)

打印出来:

>>10
>>[2,5]

编辑

这就是无限循环的问题,但在某些情况下不会给你正确的答案,例如20 因为它的逻辑是错误的。我修改了一点代码,这就是我所拥有的。

N = int(input())
B = N
L = []
while B != 1:
    for i in range(2,N):
        if N % i ==0:
            L.append(i)
            N = N // i
            break
    else:
        L.append(N)
        B = 1
print(L)
,

while B != 1: 给你一个无限循环。您可以使用调试器查看,例如,当 N = 9 时,B 永远不会变为 1,并且脚本会永远将 3 附加到 L。

,

你永远不会增加 i。 break 语句将您带到“while b!= 1”。所以它无限地将 2(或 N 的第一个因数)附加到 L 上。