Алгоритм гипотезы Гольдбаха показывает "индекс списка вне диапазона" выше определенного числа

Я создаю программу, в которой пользователь может ввести четное число от 4 до 5000, и программа выведет список пар простых чисел, которые суммируют число, указанное во входных данных.

Моя программа отлично работает, чтобы поместить все простые числа в список, и проверяет, что входное значение является четным целым числом от 4 до 5000. Для небольших входных данных это работает отлично, но для больших входных данных оно говорит, что "индекс списка вне диапазона" и Понятия не имею почему.

Это код, который я использовал: (добавлены комментарии, чтобы помочь)


global prime_numbers
prime_numbers=[]
user_number=0
def start():
    for i in range(5000):
        prime_test(i)

def prime_test(a):
    global prime_numbers
    x = True 
    for i in range(2, a):
            while x:
               if a%i == 0:
                   x = False
                   break
               else:
                   x = True
                   break


if x==True and a!=0 and a!=1:
    prime_numbers.append(a)
    #print(prime_numbers[int(len(prime_numbers)-1)])#
    #prints last digit/\ /\ /\ (for testing purposes)#
    if a==4999:
        user_input()
def user_input():
    user_number=input('please enter a whole even number between 4 and 5000:   ')
    #checks if user input is valid#
    try:
        #checks for a number#
        user_number=float(user_number)
        #checks for an integar#
        if user_number!=int(user_number):
            print('that is not a whole number')
            user_input()
        #checks for an even number#
        a=(user_number/2)
        if a!=int(a):
            print('that is not an even number')
            user_input()
        #checks it is inbetween 4 and 5000#
        elif user_number<4:
            print('that is not greater than or equal to 4')
            user_input()
        elif user_number>5000:
             print('that is not less than or equal to 5000')
             user_input()
        #if it is a valid input it procedes to the next section#
        else:
            q=int(user_number)
            goldbergs_conjecture(q)
    #the bit that checks to see if it is a number#
    except ValueError:
        print('that is not a number')
        user_input()
def goldbergs_conjecture(q):
    global prime_numbers
    for i in range(q):
        #serches for the first prime number in the list then the second ect...#
        x=prime_numbers[i]
        #y= user input minus a prime number form the list#
        y=q-x
        #if y is also in the list then it must be prime also so these are printed#
        if y in prime_numbers and x<(q/2):
            print(str(x) + ' + ' + str(y))
        #had to add this seperatly because if they were the same then this /\/\ didnt catch them#
        if y==x:
            print(str(x) + ' + ' + str(y))
#gives the user something to look at whilst the list is generating#    
print('loading...')
start()

Для небольшого числа это прекрасно работает, например


>>> 
 RESTART: C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py 
loading...
please enter a whole even number between 4 and 5000:   568
5 + 563
11 + 557
47 + 521
59 + 509
89 + 479
101 + 467
107 + 461
137 + 431
149 + 419
167 + 401
179 + 389
251 + 317
257 + 311
>>> 

Но для большего числа, такого как 800, (на самом деле его любое число выше 668 по какой-то причине, если это помогает), тогда он говорит: "IndexError: список индекса вне диапазона"


>>> 
 RESTART: C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py 
loading...
please enter a whole even number between 4 and 5000:   800
3 + 797
13 + 787
31 + 769
43 + 757
61 + 739
67 + 733
73 + 727
109 + 691
127 + 673
139 + 661
157 + 643
181 + 619
193 + 607
199 + 601
223 + 577
229 + 571
277 + 523
313 + 487
337 + 463
367 + 433
379 + 421
Traceback (most recent call last):
  File "C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py", line 72, in <module>
    start()
  File "C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py", line 6, in start
    prime_test(i)
  File "C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py", line 26, in prime_test
    user_input()
  File "C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py", line 52, in user_input
    goldbergs_conjecture(q)
  File "C:\!A-level cs preparation\9th problem, goldbach's conjecture\main code first attempt.py", line 61, in goldbergs_conjecture
    x=prime_numbers[i]
IndexError: list index out of range
>>> 

Я понятия не имею, почему это не работает после 668 года.

3 ответа

Решение

Итак, мои главные советы: не используйте try, если он вам действительно не нужен. Это будет скрывать ошибки кода. Избегайте глобальных переменных, если вам это действительно не нужно. Через некоторое время у вас кружится голова.

В вашем коде второй грех является источником проблемы. Вы запускаете цикл for в диапазоне (q), который указывает на prime_numbers [i]. Привязка этих индексов означает, что оба списка должны иметь одинаковый размер, или простые числа должны быть меньше q. Написать print(i) и напечатайте (len(prime_numbers)), в начале вашего for i in range(q) петля. Вы увидите, что скрипт ломается, когда я> len (prime_numbers)

Чтобы избежать попытки, напишите для своего ввода регистр регулярных выражений. Чтобы избежать глобального, передайте список в качестве аргумента функции или запустите цикл из списка prime_number.

Надеюсь это поможет.

Вы в цикле (в goldbergs_conjecture()) над range(q), который может быть где угодно от 4..5000.

Но вы ищете это значение: x=prime_numbers[i] который является индексом в prime_numbers список.

prime_numbers список не гарантируется, пока range(q)потому что (по определению) в данном диапазоне простых чисел меньше, чем целых чисел.

Попробуйте распечатать длину prime_numbers список, прежде чем просить ввода. Бьюсь об заклад, это близко к 668.

Вместо этого вы можете попробовать что-то вроде:

for prime in prime_numbers:
    if prime >= q:
        break

    ... do something with prime

Чтобы охватить все простые числа меньше q,

Он ломается, потому что число простых чисел от 0 до 5000 меньше 5000 (вероятно, меньше 668, если вы не ошиблись, рассказав об условиях ошибки). Я бы посоветовал использовать в строке 59 использовать range(len(prime_numbers)) вместо range(q) (вы также можете использовать enumerate функция)

Другие вопросы по тегам