【问题标题】:Failing to change bool var state in loop无法在循环中更改 bool var 状态
【发布时间】:2015-09-19 20:14:53
【问题描述】:

我正在尝试根据:Prime equations 编写质数检查器

到目前为止,我的代码如下所示:

def primer(x):

    prime = False
    x = math.sqrt(x)
    if type(x) == float:
        x = math.ceil(x)

    for i in range(3,x + 1):
        if (i % 2) == 1:
            prime == True
    print(prime)

尝试使用 37 作为 primer(37) ---> sqrt(37) 是 6.08

四舍五入到 7

7 mod 3 = 1(质数)

我不知道prime var 没有更新。请问有人能指点一下吗?

编辑:链接一些 repl -> Repl Link

【问题讨论】:

  • 您可以使用range(3,x + 1, 2) 加快速度;仅检查奇数 - 并分别检查偶数。
  • @hiroprotagonist 将添加!谢谢
  • @Onilol,另外,您可以在if 中添加break
  • 代码错误。 i 永远是真的

标签: python if-statement for-loop range


【解决方案1】:

你实际上并没有分配:

prime == True

应该是:

prime = True

== 是比较运算符,= 用于赋值。

您可以使用any 函数来创建您的素数检查器,而且我们只需要循环到 x 的 sqrt 并检查奇数。我还添加了链接中提到的fermat's little theorem 的实现:

def primer(x):
    if x == 2:
        return True
    if x % 2 == 0 or x < 3:
        return False
    return not any(x % i == 0 for i in range(3, int(x ** .5) + 1, 2))


from random import randint


def fermat_little_theorem(p, conf):
    """
     int p to test if prime
     conf is the confidence level/how many times to try n ** (p - 1) % p == 1
    returns with confidence p is prime based on 1/2^conf
    """
    if p <= 1:
        return False
    for _ in range(conf):
        n = randint(1, p - 1)
        if not n ** (p - 1) % p == 1:
            return False
    return True

【讨论】:

  • 你也只在for循环结束时打印素数,所以你只会看到最后一次迭代的值
  • 天啊!太他妈瞎了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2018-09-02
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多