【问题标题】:A program that's supposed to find out whether a number is prime or not isn't working as expected一个应该找出一个数字是否是素数的程序没有按预期工作
【发布时间】:2019-10-12 06:21:55
【问题描述】:

我正在尝试编写一个程序,该程序将使用一个非常简单的公式来判断一个数字是否为素数:将数字 (x) 除以 4。查看从 1 到 x/4 的任何数字是否完全除以 x .如果不是,x 将是素数。

该程序目前向我显示了将 x 除以从 1 到 x/4 的每个数字的结果。我想这样做:如果有一个可以完美分割的数字,打印 x 不是素数并结束程序。或者如果没有除以 x 的数字,只需说 x 是质数并结束程序。

我尝试使用布尔值,但随后它将每个数字都显示为素数,它不应该这样做,因为程序还不知道 x 可以完全除以 1 但仍然是素数。

value = int(input("Type a number: "))

# prime = True

if value.__class__ == int:
    x = value / 4
    list = list(range(1, int(x) + 1))
    for number in list:
        y = value / number

        while y >= 0:
            y -= 1
            if y == 0:
                print(f"{value} is not prime")
                # print("yes")
                # y == -1
            elif 0 < y < 1:
                print(f"{value} is prime")
                # print("no")
    # if prime:
    #     print(f"{value} is prime")
    # else:
    #     print(f"{value} is not prime")

【问题讨论】:

  • 欢迎来到 StackOverflow。不幸的是,您对所需算法的描述不清楚。你写“看看从 1 到 x/4 的任何数字是否能完全除以 x。如果不是,x 将是素数。”但是x 将大于这些数字中的任何一个,因此它们中的任何一个都不会完美地被除以 x。您的意思是“完全分成 x”吗?如果是这样,1 可以完美地划分为任何数字。最后,x=4x=6x=9 的明显算法失败。请澄清。
  • 顺便说一句:你应该摆脱if value.__class__ == int。首先,您已经将输入转换为 int。如果它无法转换为 int,您将在那里得到一个 ValueError 并且永远不会到达有问题的行。其次,这不是您应该检查对象类的方式。 isinstance(x, int) 是一种选择,但根据您在极端情况下想要的行为类型,有几种不同的选择。
  • 设置y = value / number并将y减1直到小于1,然后检查它是否为0是写if value % number == 0:的一种非常慢的方法。 (% 得到除法的余数。)
  • @RoryDaulton 你是对的。它应该是相反的。一旦我知道我当前的代码有什么问题,我就会用 1 来解决这个问题。我不知道为什么它与 4、6 或 9 的行为不同。我想知道我的程序在幕后到底在做什么,但我对此一无所知。

标签: python primes


【解决方案1】:

你的第一个逻辑是错误的。需要查到math.sqrt(x)

>>> import math
>>> [a/4 < math.sqrt(a) for a in range(100)]
[False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]

从技术上讲,这将在 x=15 之外起作用,但是您将检查比您需要的更多的数字 您可以通过查看图表来了解这一点https://www.desmos.com/calculator/dybweqs6lk

【讨论】:

    【解决方案2】:

    首先你在哪里找到这个公式?

    其次,您没有实现您在代码中所说的内容。 你需要检查划分后所有可能的四种类型,并根据它们全部选择结果,而不是在任何循环中。

    【讨论】:

    • 我想到了这个,我想我也可以证明它有效。所有可能的种类是什么?而且我不确定你在说哪个循环。我对编码完全陌生,希望你能帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2012-07-20
    • 2021-05-16
    • 1970-01-01
    • 2022-01-22
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多