【问题标题】:Test numbers between 2 values ​successively in Python在Python中连续测试2个值之间的数字
【发布时间】:2022-01-02 13:37:47
【问题描述】:

"我们可以在不通过表格的情况下应用这个算法:如果 d 从 2 变化,则整数 n 是素数 在 √n n 检查条件: 只要它不能被 d 整除,我们就增加 d 的值。如果 n 可被 d 整除,则 n 不是第一。当然,如果n不能被d所取的任何值整除,那么n 是素数。"

我的问题是如何在 python 中说 d 在 √n 处从 2 变化?范围 ?兰丁?但 randint 是随机的,范围不适用于 math.sqrt(n)

√n 的意思是如果我选择 7 作为数字 n 和 2 作为 d 那么这是愚蠢的,因为 √7 是 2.64575131106 所以我只是在 2 和 2.64575131106 之间测试算法.. .

回答后编辑:

当我返回 True 时,什么都不显示

【问题讨论】:

  • 这并不愚蠢。事实上,要测试 7 是否为素数,您只需要测试 7 不能被 2 整除。
  • 问题是,你想测试是否存在两个数字 a,b 2 n == a * b。但是,只有当 a = sqrt(n) (反之亦然)时,才可能出现这样的相等性。实际上,如果它们都小于或都大于 sqrt(n),那么它们的乘积将小于或大于 n。因此,您只需要使用 2
  • 请注意,将搜索限制在 2 和 sqrt(n) 之间是一种优化。如果你搜索得太多,例如如果你搜索 2 和 sqrt(n)+1 之间的所有除数 d,或者搜索 2 和 n-1 之间的所有除数 d,它也是正确的。只需确保在可能的除数中不包含 1 或 n

标签: python python-3.x


【解决方案1】:

使用math.sqrt 并向上取整

您可以使用int(sqrt(n) + 0.5)sqrt(n) 向上舍入为整数。

from math import sqrt

def is_prime(n):
    for d in range(2, int(sqrt(n) + 0.5)):
        if n % d == 0:
            return False
    return True

或者,使用allany

from math import sqrt

def is_prime(n):
    return all(n % d > 0 for d in range(2, int(sqrt(n) + 0.5)))

使用math.isqrt

在python>=3.8中,math模块中有一个名为isqrt的函数:https://docs.python.org/3/library/math.html#math.isqrt

它返回最大整数a,使得a*a <= n。这正是我们想要的。

from math import isqrt

def is_prime(n):
    for d in range(2, isqrt(n)+1):
        if n % d == 0:
            return False
    return True

或者,使用allany

from math import isqrt

def is_prime(n):
    return all(n % d > 0 for d in range(2, isqrt(n) + 1))

根本不使用sqrt

或者,如果您根本不想使用math.sqrt

def is_prime(n):
    d = 2
    while d * d <= n:
        if n % d == 0:
            return False
        d += 1
    return True

【讨论】:

  • 好的,谢谢,我试试这个
  • 我用 sqrt(n) + 0.5 测试了第一件事,当它是真的我的终端不会显示它,它只在它是假的时候显示
  • @swken999 你确定你把return True放在最后吗?
  • 是的,它仅在我打印时才有效(True)
  • 什么?这是一个功能。不要使用print。使用return
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2021-07-14
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多