【问题标题】:What's the wrong in this code to find prime factorization这段代码中查找素数分解有什么问题
【发布时间】:2021-07-10 01:32:34
【问题描述】:

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

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)

【问题讨论】:

  • 您使用的 IDE 应该(希望)有一个调试器。就像汉谟拉比说的,你应该使用调试器逐行遍历你的代码,看看它到底在做什么,每个点的变量是什么,看看它在哪里没有做你想让它做的事情。知道如何使用调试器会有很大帮助

标签: python prime-factoring


【解决方案1】:

问题在于 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)

【讨论】:

  • 好的,但是如果你这样做,输出不会是数字的素因数分解,你可以试试数字 20,你会看到。
  • @Mohamed_Elsharaky,我刚刚添加了正确的逻辑,希望对您有所帮助
  • 非常感谢这个我尝试修改程序的逻辑,我发现我在使用变量B时出错了,再次感谢。
  • 不客气,别忘了标记为答案
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 好的,但是我设置了 B = N // i 这样如果语句为真则 B 的值将被更改,如果 for 循环没有 break 结束,则 B 将更改为 1所以while循环将被终止。
    • 如果 B 没有准确地更改为 1,它不会跳出 while 循环。
    • 我知道,但你能详细解释一下吗?
    • 上面的答案表明根本不想要break语句。 break 将您带到第 4 行,for 循环从开头 (2) 开始,而不是从序列中的下一个数字开始。由于循环永远不会结束,代码永远不会到达“else:”
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2018-09-09
    相关资源
    最近更新 更多