【问题标题】:I'm stuck with a prime number calculator我被质数计算器困住了
【发布时间】:2022-01-06 10:36:34
【问题描述】:

我正在为初学者阅读一本关于 Python 编程的书。 它的任务之一是编写一个计算“n”个素数的素数计算器。 到目前为止,我已经研究过字符串、逻辑门、while 和条件。

我们的想法是只使用这些运算符。

我需要帮助,因为我被这段代码卡住了。

这是我所做的:

odd = 3
number = 2
limit = int(input('How many primes do you need: '))
remnant = number % odd
even_remnant = number % 2
counter = 0

while counter <= limit:
    if number == 2:
        print('2')
        number += 2
    elif (number % 2) != 0:
        remnant = number % odd
        while odd < number:
            print('while2')
            remnant = number % odd
            if (number % odd) != 0 and odd == (number - 1):
                print(f'{number}.')
                odd = 3
                number += 1
                counter += 1
                break
            elif (number % odd) == 0:
                break
            odd += 2
    elif (number % 2) == 0:
        number += 1
        odd = 3
     

你怎么看?

谢谢大家。

【问题讨论】:

  • 粗略阅读,我可以看到两个从未定义的变量,counterimpar。您还有一些已定义但从未使用过的变量,remnanteven_remnant。我几乎可以理解你想要做什么,但并不完全。我认为你应该离开键盘,写下你正在使用的算法,并解释为什么你认为算法会成功。此外,在 python 中,for 循环是非常基本的,特别是for 循环由range“函数”指定的整数序列。你应该为这个问题学习它。

标签: python math logic primes


【解决方案1】:

穿上你的调试裤,我们进去。

首先,代码不会按照编写的方式运行。变量counterimpar 未定义。第一步是删除这样的语法错误。看起来我们想从 0 开始计数器,并且使用 impar 的行不是必需的,因此我们可以删除它。

odd = 3
number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    if number == 2:
        print('2')
        number += 2
    elif (number % 2) != 0:
        while odd < number:
            print('while2')
            remnant = number % odd
            if (number % odd) != 0 and odd == (number - 1):
                print(f'{number}.')
                odd = 3
                number += 1
                break
            elif (number % odd) == 0:
                break
            odd += 2
    elif (number % 2) == 0:
        number += 1
        odd = 3

现在代码运行没有错误,但它所做的只是打印

2
while2

然后终止失败。

所以我们知道我们只进入了一次while odd &lt; number 循环,并且在该循环期间我们不打印任何内容。如果我们还在其中打印oddnumber 的值,我们会看到odd = 3number = 5。两个 if 条件都不满足,odd += 2 行被命中。现在odd = 5 和 while 循环退出而不打印 5,即使 5 是素数。如果我们想通过满足条件odd == (number - 1) 来执行我们的打印语句,我们最好在递增odd 时以1 为步长。我们换成odd += 1,重新运行代码。

现在当我说我需要 2 个素数时,它会打印出来

2
5
7

然后永远打印while2。至少它打印素数!但是它跳过了 3 并且打印了太多,我不得不使用 Ctrl-C 退出程序。打印了太多素数,因为从未达到外部循环 while counter &lt;= limit: 条件。在循环内部,我们从不增加 counter 的值。每当我们打印一个素数时,我们都需要增加计数器。

另外,为了确保我们打印 3,请查看循环中的第一个 if 条件。

if number == 2:
    print('2')
    number += 2  # Oops, we skipped over 3

让我们更新一下:

if number == 2:
    print('2')
    print('3')
    counter += 2 # Let's count both of these!
    number += 2

在另一个打印之后添加counter += 1,重新运行我们得到的代码

How many primes do you need: 2
2
3
5.

How many primes do you need: 3
2
3
5.
7.

糟糕,我们得到的比我们需要的多。这是因为当counter == limit 我们再运行一​​次while 循环。让我们将 while 循环条件更改为 while counter &lt; limit:。这种变化让我们得到了正确数量的素数。

How many primes do you need: 4
2
3
5.
7.

但是如果我们要 5 个

How many primes do you need: 5
2
3
5.
7.

而且程序永远不会退出。如果我们检查奇数和数字的值,我们会看到循环以odd=3number=9 一遍又一遍地运行。

当奇数=3 和数=9 时通过代码推理。当我们点击这段代码时,我们会跳出while odd &lt; number while 循环

elif (number % odd) == 0
    break

但是我们从不增加number的值,所以下一次循环仍然等于9。让我们将其更新为

elif (number % odd) == 0
    number += 1
    break

现在当我们重新运行我们得到的代码时

How many primes do you need: 5
2
3
5.
7.
11.

嘘!它在要求更多素数时也有效。这是当前的代码:

odd = 3
number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    if number == 2:
        print('2')
        print('3')
        counter += 2
        number += 2
    elif (number % 2) != 0:
        while odd < number:
            if (number % odd) != 0 and odd == (number - 1):
                print(f'{number}.')
                odd = 3
                number += 1
                break
            elif (number % odd) == 0:
                number += 1
                break
            odd += 1
    elif (number % 2) == 0:
        number += 1
        odd = 3

现在我们有了工作代码,让我们改进它!我们的错误之一是我们忘记在一种情况下将数字增加 1。请注意,无论我们如何退出外部 while 循环while counter &lt;= limit:,我们都希望增加数字。因此,与其在很多地方都这样做,不如将所有这些都移到 while 块的末尾。

每当退出 while 块时,我们还设置了 odd=3。我们要确保在 while 循环开始时奇数 = 3,所以让我们把它移到那里。现在elif (number % 2) == 0: 块中没有更多代码,所以我们可以删除该行。

number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    odd = 3
    if number == 2:
        print('2')
        print('3')
        counter += 2
    elif (number % 2) != 0:
        while odd < number:
            if (number % odd) != 0 and odd == (number - 1):
                print(f'{number}.')
                counter += 1
                break
            elif (number % odd) == 0:
                break
            odd += 1

    number += 1

我认为如果 while 循环在满足条件时结束,而不是在 break 语句上结束,代码会更清晰。如果我们发现数字可以被某物整除,或者我们用完了要检查的数字,我们希望 while 循环结束。

`while number % odd != 0 and odd < number:`

在 while 循环中我们唯一需要做的就是增加奇数。然后在循环之后,我们可以检查奇数的值,看看满足哪个条件。

number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    odd = 3
    if number == 2:
        print('2')
        print('3')
        counter += 2
    elif (number % 2) != 0:
        while number % odd != 0 and odd < number:
            odd += 1
        if odd == number: # No divisor was found!
            print(f'{number}.')
            counter += 1

    number += 1

请注意,我们正在“硬编码”被 2 (number % 2) != 0 整除,然后使用变量 odd 检查其他所有内容的整除性。如果我们从 2 而不是 3 开始奇数,我们就不必进行硬编码。

number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    odd = 2
    if number == 2:
        print('2')
        print('3')
        counter += 2
    while number % odd != 0 and odd < number:
        odd += 1
    if odd == number: # No divisor was found!
        print(f'{number}.')
        counter += 1

    number += 1

当我们进行此更改时,我们还注意到我们找到了两次素数 2 和 3,因此我们可以删除它们的硬编码版本:

number = 2
limit = int(input('How many primes do you need: '))

counter = 0
while counter < limit:
    odd = 2
    while number % odd != 0 and odd < number:
        odd += 1
    if odd == number: # No divisor was found!
        print(f'{number}.')
        counter += 1

    number += 1

【讨论】:

    【解决方案2】:

    当我尝试运行此代码时,它告诉我未设置 Counter,因此在进入循环之前将 Counter 设置为 0。

    另一个问题是您首先在循环的第一种情况下找到 2,这很好。在循环再次运行之后,现在将数字设置为 4。因为您的 += 2 指令。

    然后运行最后一个 elif 案例。其中 (number % 2) == 0。这里设置 number = 5,odd = 3。但它不打印 3。我认为你的意思是这样做。

    现在它再次运行循环,并输入第二个 elif case (number % 2) != 0。 elif 子句中的第一行变量 impar 没有定义,所以它会失败。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    如果你使用算术逻辑位来计算素数的'n'数,你不需要使用这么多语句-wise 运算符,您将在您所指的 Python 书籍的未来章节中学习这些运算符。
    我会帮你修改代码。

        number = int(input("Enter range: "))
        print("Prime numbers:", end=' ')
        for n in range(2, number):
            for i in range(2, n):
                if n % i == 0:
                    break
            else:
            print(n, end=' ')
    

    【讨论】:

    • 这里我没有使用逻辑和位运算符,%(modulus) 函数给出了除法运算的提示。因此你可以把它变成一个简单的程序。
    【解决方案4】:

    我看不懂你的程序,但是很好

    def is_prime(n):
        st = "prime" #  being prime status
    
        for i in range(2,n):
            if n % i == 0: # if number is prime
                st = "not prime"
                break;
    
    
        return st 
    
    
    
    n = int(input("enter n:  ")) 
    
    pc = 0 # prime conter
    c = 1 # counter
    
    
    while n != pc:
        if is_prime(c) == "prime":
            print (c)
            pc += 1
        c += 1    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多