我被质数计算器困住了

I'm stuck with a prime number calculator

我正在阅读一本关于 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
     

你怎么看?

谢谢大家

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

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

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

现在 运行 再次循环,并输入第二个 elif 案例(编号 %2)!= 0。 elif 子句的第一行未定义变量 impar,因此它会失败。

要计算素数的 'n' 数,您不需要使用那么多语句,如果您使用 arithmeticlogical 运算符,您将在所引用的 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=' ')

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

首先,代码并不像写的那样运行。变量 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 < 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 <= limit: 条件。在循环内部,我们从不增加计数器的值。每当我们打印素数时,我们都需要增加计数器。

此外,为了确保我们打印 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 < 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 和 number 的值,我们会看到循环是 运行 odd=3number=9 一遍又一遍。

当odd=3,number=9时通过代码推理。当我们点击这段代码

时,我们跳出了 while odd < number while 循环
elif (number % odd) == 0
    break

但是我们并没有增加number的值,所以下一次循环它还是等于9。让我们将其更新为

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

现在当我们重新[​​=98=]我们得到的代码时

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 <= limit:,我们都希望递增数字。因此,我们不要在很多地方这样做,而是将所有这些都移到 while 块的末尾。

每当退出 while 块时,我们也设置 odd=3。我们要确保在 while 循环开始时 odd=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 循环中唯一需要做的就是增加奇数。然后在循环之后,我们可以检查odd的值,看看满足了哪个条件。

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

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

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