Подтвердить что ты не робот

Принтер с числовым номером останавливается на 251, почему?

Я начал изучать Python сегодня, и я придумал идею создания программы, которая печатает все простые числа от 0 до 10 000. Мне удалось заставить мою программу распечатать все простые числа до 251, после чего она останавливается печать номеров. Почему это делается?

Вот код:

for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck is divider:
        print(numberToCheck, "is a prime number.")
4b9b3361

Ответ 1

Проблема заключается в том, что вы используете is вместо ==. Оператор is выполняет сравнение идентичности объектов, которое "работает" для всех чисел ниже 256 из-за деталей реализации. 251 - наибольшее число ниже 256 (проверьте здесь, следующее правое - 257), и после этого is возвращает False:

>>> 254 + 1 is 255
True
>>> 255 + 1 is 256
True
>>> 256 + 1 is 257
False

Оператор равенства ==:

>>> 254 + 1 == 255
True
>>> 255 + 1 == 256
True
>>> 256 + 1 == 257
True

Ответ 2

Используйте == для проверки равенства чисел:

for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck == divider:
        print(numberToCheck, "is a prime number.")
Оператор

Is используется для проверки id двух объектов, а == оператор проверяет их значения.

Python реализует массив целых чисел для значений от -5 до 256, а когда вы создаете объект int в этом диапазоне, вы получаете ссылку на существующую реализацию массива. Поэтому id всех целых объектов в этом диапазоне одинаково, но для объектов целых чисел вне этого диапазона они различны, как показано ниже:

>>> a = -6
>>> b = -6
>>> a is b      # a and b has different id
False

>>> a = -5
>>> b = -5
>>> a is b      # a and b has same id
True

>>> a = 256
>>> b = 256
>>> a is b      # a and b has same id
True

>>> a = 257
>>> b = 257
>>> a is b      # a and b has different id
False

И вот по этой причине ваша программа печатает простые числа до 251, но не next prime 257 и впоследствии, однако ваша программа работает до numberToCheck достигает 9999.

Кроме того, вы можете рассмотреть более быстрый алгоритм генерации простых чисел, например Сито Эратосфена.

В принципе, вы должны проверить делимость numberToCheck со всеми штрихами между 2 и (ранее найденный простой или квадратный корень из numberToCheck, в зависимости от того, что меньше).

Ответ 3

Ошибка в последнем if. Измените его

if numberToCheck is divider:

к

if numberToCheck == divider:

Объяснение: is проверяет, являются ли refences равными, а == проверяет равенство значений (более конкретно, он вызывает метод __eq__ для ваших элементов)

Причины, по которым у вас есть первые простые числа для печати до 251, - это то, что кэширование python кэширует все мелкие целые числа.

Например:

>>> 100 == 10**2
True
>>> 100 is 10**2
True
>>> 1000 == 10**3
True
>>> 1000 is 10**3
False

(Пример из здесь) Вы должны использовать is только для проверки ссылок (объектов, которые должны быть не только равными, но и одного и того же экземпляра) или сравнить с None.

Ответ 4

Никогда не сравнивайте целые числа с is. Всегда используйте ==.

== следует использовать для сравнения чисел.

Вот фиксированный код:

for numberToCheck in range(2,10000):
divider = 2
while numberToCheck > divider:
    if numberToCheck % divider == 0:
        break
    else:
        divider += 1
if numberToCheck == divider:
    print(numberToCheck, "is a prime number.")

Ответ 5

Проблема заключается в том, что вы использовали is. is не проверяет равенство, проверяет идентификатор объекта (адрес памяти); объект a совпадает с объектом b?

Обратитесь к этим вопросам:

Есть ли разница между` == `и` is` в Python?

"is" оператор ведет себя неожиданно с целыми числами

Почему (0-6) -6 = False?


Чтобы решить вашу проблему:

def prime(numberToCheck):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider == 0:
            break
        else:
            divider += 1

        if numberToCheck == divider:
            print(numberToCheck, "is a prime number.")

Немного тривиальная заметка здесь, но может иметь решающее значение в более крупных приложениях: я создал функцию под названием prime, чтобы максимизировать повторное использование кода. Теперь вы можете передать функцию prime независимо от числа, которое вы хотите проверить, если оно простое или нет, лучше, чем жесткое кодирование числа, которое вы хотите проверить!

Ответ 6

Вы не должны сравнивать числа с is. Всегда используйте == для тестирования равенства.

Ответ 7

который вы используете, вместо ==. Во всяком случае, код мудрый youre тратить ресурсы проверки на простые как это. вам нужно только проверять от 2 до sqrt (n), и вы должны предпочтительно хранить простые числа и проверять только их, пока не достигнете их, например, вы проверяете, является ли число 41 простым, проверьте простые числа 2 3 5, а затем вы знаете он не является простым (потому что все остальные числа между простым и sqrt не являются первыми, так что вы уже проверили их) создайте список простых чисел, когда вы идете.

попробуйте этот код:

import math
primes = [2]
for n in range(3,100):
    for i in primes:
        if n in primes:
            break
        if n%i == 0:
            break
        if i> math.sqrt(n):
            primes.append(n)
            break

Ответ 8

Эта ссылка поможет вам, почему бы не использовать это

In [5]: a = 254+1

In [6]: b = 255

In [7]: a is b  # both are same objects
Out[7]: True

In [8]: id(a)
Out[8]: 37644344 # id of a

In [9]: id(b)
Out[9]: 37644344   # same id as a

для > 256

In [10]: a = 256+1

In [11]: b = 257

In [12]: a is b # both are different objects but values are same
Out[12]: False

In [13]: id(a)
Out[13]: 39721992 # id of a

In [14]: id(b)
Out[14]: 39722592 # new id created not same as a

is всегда сравнивается с объектами, а не значениями

почему только до 256?

из документы python

Текущая реализация хранит массив целых объектов для всех целые числа от -5 до 256, когда вы создаете int в этом диапазоне, вы просто верните ссылку на существующий объект.

когда вы назначаете a=255 только вы добавляете a как ссылающийся на excisting 255. когда a=257 будет создан новый объект типа int