Счастливые числа в Python

#python #numbers #sieve

#python #числа #сито

Вопрос:

Для тех, кто интересуется; счастливые числа генерируются путем исключения чисел на основе их положения в наборе. то есть:

 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
 

Первое устраняет каждое второе число, поскольку второе значение равно 2:

 1,3,5,7,9,11,13,15,17,19,21
 

Первое оставшееся число в списке после 1 равно 3; таким образом, исключается каждое третье число:

 1,3,7,9,13,15,17,19,21
 

Следующее число — 7; исключите каждое 7-е число в списке:

 1,3,7,9,13,15,21
 

Следующий выживший nunmber после 7 равен 9, но, очевидно, их недостаточно для устранения.
Для получения дополнительной информации вы можете проверить счастливое число

Итак, если мой список не содержит отрицательного числа и начинается с 1, т.е.:

     numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22']
 

Мой код должен удалять каждое число, если только это не счастливое число, поэтому я попытался:

     def lucky_numbers(numbers):
        del numbers[::-2]   # Delete even numbers
        while int(numbers[1]) < len(numbers):
            x = int(numbers[1])
            del numbers[-1::x]
            print(numbers)
            return
        return
    lucky_numbers(numbers)
 

Но он возвращает:

 ['1', '3', '5', '7', '9', '11', '13', '15', '17', '19']
 

Где я ошибаюсь? Или есть какой-нибудь эффективный способ написать это? Спасибо.

Комментарии:

1. 1,3,7,9,13,15,17,19,21 разве второе число не равно 3? так не следует ли снова удалять каждый 3-й элемент?

2. Он переходит к следующему оставшемуся числу. «Продолжает удаление n-го оставшихся чисел, где n — следующее число в списке после последнего оставшегося числа». Так что это как 2-й, 3-й, 7-й, 9-й, 13-й…

Ответ №1:

Отрицательный индекс немного сбивает меня с толку (по крайней мере), посмотрите, легко ли интерпретировать этот код-

 numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22']

def lucky_numbers(numbers):
    index = 1
    next_freq = int(numbers[index])
    while int(next_freq) < len(numbers):
        del numbers[next_freq-1::next_freq]
        print(numbers)
        if str(next_freq) in numbers:
            index  = 1
            next_freq = int(numbers[index])
        else:
            next_freq = int(numbers[index])
    return


lucky_numbers(numbers)
 
 ['1', '3', '5', '7', '9', '11', '13', '15', '17', '19', '21']
['1', '3', '7', '9', '13', '15', '19', '21']
['1', '3', '7', '9', '13', '15', '21']
 

Комментарии:

1. Хорошо, теперь я вижу свою ошибку. По оценкам, я слишком много думал об этом. Большое вам спасибо, ценю это.