Цикл «пока» вызывает ошибку при поиске простых множителей числа. И не могу использовать эту программу с большими числами

1

Создал программу для поиска простых коэффициентов натурального числа, но я получаю сообщение об ошибке:

multipliers = []
a = 2
value = input("Put a natural number here: ")
value = int(value)

for i in range(1, value):
    if value % i == 0:
        multipliers.append(i)

for x in multipliers:
    while a < x:
        if x % a == 0:
            multipliers.remove(x)
        else:
            a += 1

print(multipliers)

Все, что я хочу сделать, это: Получить входное значение, найти множители значения и составить список из них, взять множители 1 на 1 и попытаться разделить на [2, 3, 4, 5...] если a является множителем x, удалите его из списка и получите другое значение из списка как x и сделайте то же самое.

Но когда я пытаюсь запустить это, я получаю сообщение об ошибке, которое говорит

ValueError: list.remove(x): x нет в списке

Я не знаю, где я делаю неправильно. Не могли бы вы мне помочь?

  • 2
    Это потому, что вы изменяете список, удаляя из него элементы.
  • 0
    Попробуйте создать новый список, содержащий нужные значения, вместо удаления элементов из первого списка. Это означает изменение условия в вашем втором операторе if и использование добавления вместо удаления
Показать ещё 2 комментария
Теги:
prime-factoring

1 ответ

0
Лучший ответ

Поскольку x удаляется из списка, тогда цикл while снова циклытся, и он пытается удалить x из списка.

Чтобы исправить это, добавьте break в цикле while так:

for x in multipliers:
    while a < x:
        if x % a == 0:
            multipliers.remove(x)
            break
        else:
            a += 1

Вы также можете заменить второй цикл цикла на понимание списка:

factors = [x for x in multipliers if all(x % a != 0 for a in range(2, x))]
  • 0
    Это работает хорошо, но я не могу использовать эту программу с такими номерами, как "600851475143". Я не знаю почему. Не могли бы вы мне помочь?
  • 0
    @EmreUYGUN ошибка памяти?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню