【问题标题】:Beginner prime factorization初级素数分解
【发布时间】:2015-05-04 21:49:36
【问题描述】:

我编写了一个初学者程序,旨在查找和打印任意数的质因数:

def is_prime(n):
    if n == 3:
        return True
    elif n == 4:
        return False
    else:
        n = int(n**0.5)+1
        for i in range(2,n):
            if n % i == 0:
                return False
        return True

def prime_factors(n):
    for i in range(2,n):
        if n % i == 0:
            x = i
            primes.append(x)
            y = n / x
            return y
            break


primes = []

def main(y):
    while not is_prime(y):
        y = prime_factors(y)
    primes.append(y)
    print(primes)

以下是程序运行的示例,让我感到困惑:

main(625)

[5, 5, 5, 5]

...

main(160)

[160]

...

main(6)

[6]

...

main(1007)

TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'float'

有些输入有效,有些则无效。我不知道为什么。我也不知道如何解决这个错误。请帮忙。谢谢。

【问题讨论】:

  • 你的代码让我很困惑。为什么prime_factors 不检查每个因素is_prime?为什么你有一个primes 的固定列表?我不明白为什么你会期望这会起作用。
  • 但是特别是......如果n%i 从不等于零,那么它返回分配给y的None。 is_prime(None) 尝试获取平方根但失败,因为 None**0.5 == ? 例如 prime_factors(5) 将返回 None
  • breakreturn 之后立即做什么?
  • @Joel 照亮了我的愚蠢。不知道return 休息。 但是,这是我的第一个程序。所以我并不觉得太糟糕。
  • 只是为了说明问题所在:在n=int(n**0.5)+1 语句中,您更改了n 的值。但是两行之后你检查是否n%i==0。您希望它是旧的n。所以至少你需要使用m=int(n**5)+1,但更好的是给它一个更具描述性的名称。现在的角色很便宜。

标签: python primes factors


【解决方案1】:

您的 is_prime 函数似乎在这些行中错误地重用了变量 n

    n = int(n**0.5)+1
    for i in range(2,n):
        if n % i == 0:

您可以考虑使用更具描述性的名称,例如 factor_limit

【讨论】:

  • @JoranBeasley:我不确定你想在这里告诉我什么。即使n 不是None,这里也有一个错误。
  • 恕我直言,为什么还要检查除数是否是素数?检查一个数字是否是素数需要时间和大量的迭代,一遍又一遍地对所有小于 n 的数字进行除法可能会更快。不要说“哦,你会发现无用的非素数除数”,因为如果你按顺序做,你会在 4 之前找到 2 呵呵
  • @MartinE.Zulliger:当然有更好的方法来编写整体算法。但是,这种蛮力的方法在bug被移除后仍然有效。
  • 哇。在我简单地删除n = int(n**0.5)+1 之后,每次运行都运行良好,我很确定它修复了整个程序。现在效果很好。我在另一个素数分解程序中看到了它,并意识到你只需要检查一个数字的平方根,但实现它实际上伤害了我自己的程序。我知道这个想法仍然可以使用,但我只想用我现在拥有的东西滚动。感谢您的帮助。
【解决方案2】:

你有很多很多问题,这里有一些最明显的问题

1. TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'float'

告诉你python不知道怎么None**0.5

2. 正如另一个 answer 中提到的,您正在检查 n 的平方根是否可被 i 整除,如果 N 可被 i 整除

3.

def prime_factors(n):
    for i in range(2,n):
        if n % i == 0:
            x = i
            primes.append(x)
            y = n / x
            return y
            break #<--- this is totally worthless and does nothing
    #if you get here you are returning None... which breaks(see #1)
    return [1] #might fix your problem ... 

可能还有其他一些问题

【讨论】:

  • 谢谢。通过删除仅检查平方根 (n = int(n**0.5)+1) 的整个想法,修复了 NoneType 问题,它现在可以工作,但我仍然可以正确地重新实现它。另外,是的,不知道返回休息时间,即使这应该是常识。初学者问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多