Простые числа и кортежи - PullRequest
       6

Простые числа и кортежи

0 голосов
/ 05 ноября 2019

Я новичок в Python и работаю над одной проблемой, которую не могу решить.

Что я должен делать: создать список кортежей с простыми числами, диапазон состоит из двух чисел (которые также являются простыми числами), и кортежи вэтот список должен содержать только 2 простых числа p и p + 2

Например, : заданный диапазон (11, 31), возвращенный список = [(11,13), (17, 19), (29, 31)]

Это мой код

def twin_primes(a: int, b:int) -> List[Tuple[int, int]]:

    list_primes = []
    list_final = []
    for val in range (a, b+1):
        if val > 1 :
            for n in range(2, val):
                if (val % n) == 0:
                    break
            else:
                list_primes.append(val)
    for val in list_primes:
        print(val)
        list_final.append((list_primes[val], list_primes[val + 2]))
    return list_final

print(twin_primes(11,31))

в первом цикле я определяю, какие числа в этом диапазоне простые и добавляютсяих в list_primes

во втором цикле я пытался взять простые числа из list_primes и добавить их как кортежи в list_final

, это говорит мне следующее:

list_final.append ((list_primes [val], list_primes [val + 2]))
IndexError: индекс списка вне диапазона *

Может кто-нибудь, пожалуйста, помогите мне сэто? Я думаю, что понимаю эту ошибку, но я не знаю, как исправить код, поэтому он просто берет p, p+2 в один кортеж, а затем потребуется другая пара и так далее ... также он должен игнорировать23, хотя это простое число.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

val - это не индекс в list_primes, а его элемент. Вам необходимо добавить кортеж, содержащий val и val+2 к list_final, но только если val+2 находится в списке простых чисел.

for val in list_primes:
    if val+2 in list_primes:
        list_final.append((val, val+2))

Это можно улучшить с помощью enumerate(),поскольку всегда будет случай, когда val+2 будет следующим простым числом, если оно существует.

for i, val in enumerate(list_primes[:-1]):
    if list_primes[i+1] == val + 2:
        list_final.append((val, val+2))
0 голосов
/ 05 ноября 2019

Ваша логика итерации по близнецам неверна. val устанавливается для элемента в самом списке, а не индекса. Вы относитесь к этому как к индексу. Вам нужно перебрать диапазон чисел, а не сами элементы. Я предлагаю использовать диапазон с шагом 2.

list_primes = []
list_final = []
for val in range (a, b+1):
    if val > 1 :
        for n in range(2, val):
            if (val % n) == 0:
                break
        else:
            list_primes.append(val)

for i in range(0, len(list_primes) - 1, 2):
    list_final.append((list_primes[i], list_primes[i + 1]))
return list_final

Это дает [(11, 13), (17, 19), (23, 29)], когда a = 11 и b = 31.

Но ваша логика все еще требует некоторогонастройка, так как это производит [(53, 59), (61, 67), (71, 73), (79, 83), (89, 97)], когда a = 50 и b = 100, и, очевидно, это не правильно.

...