Создать и ввести значение для последовательности OEIS в Python?

Это довольно сложная задача для меня, так как я новичок в Python. Как бы я написал программу на Python, основанную на этой функции последовательности:

http://oeis.org/A063655

и делает следующее:

Он запрашивает значение последовательности и возвращает соответствующий номер. Например, число, соответствующее 10-му значению последовательности, равно 7. Я хотел бы иметь возможность сделать это для значений более 300 000 000.

Итак, конечный продукт будет выглядеть так:

Enter a value: 4
[7]

Есть идеи с чего начать? У меня есть структура для генерации последовательностей, где (x) будет представлять математическое уравнение или числа, но я не совсем уверен, как идти отсюда или как реализовать часть "Ввести значение":

import math

def my_deltas():
    while True:
        yield (x)
        yield (x)
def numbers(start, deltas, max):
    i=start
    while i<=max:
        yield i
        i+=next(deltas)
print(','.join(str(i) for i in numbers((x), my_deltas(),(x))))

2 ответа

Если вы хотите, чтобы ваш компьютер отслеживал более 300 000 000 элементов последовательности, если каждое из них представляет собой 4-байтовое целое число, вам потребуется как минимум 300 000 000 * 4 байта или более 1,1 ГБ места для хранения всех значений. Я предполагаю, что генерация последовательности также займет очень много времени, поэтому генерация всей последовательности снова каждый раз, когда пользователь хочет получить значение, также не совсем оптимальна. Я немного озадачен тем, как вы пытаетесь приблизиться к этому точно.

Получить значение от пользователя просто: вы можете использовать val = input("What is your value? ") где val переменная, в которой вы храните ее

РЕДАКТИРОВАТЬ:

Похоже, что быстрый и простой подход был бы таким, с разумным количеством шагов для каждого значения (если только значение не простое... но давайте пока оставим концепцию простой): вам нужно целое число меньше или равно квадратному корню из n (start_int = n ** .5), и оттуда вы проверяете каждое целое число ниже, чтобы увидеть, делит ли оно n, сначала преобразовав start_int в целое число с start_int = int(start_int) (что дает вам слово start_int), вот так: while (n % start_int) != 0: start_int = start_int - 1, уменьшить на единицу, а затем установить b = start_int, Нечто похожее найти d, но вам придется разобраться с этой частью. Обратите внимание, что % является оператором модуля (если вы не знаете, что это такое, вы можете прочитать об этом, google: 'modulus python'), и ** это возведение в степень. Затем вы можете вернуть значение с помощью return заявление. Ваша функция будет выглядеть примерно так (строки начинаются с # комментарии и питон пропускает их)

def find_number(value):
    #using value instead of n
    start_int = value ** .5
    start_int = int(start_int)
    while (n % start_int) != 0:
      #same thing as start_int = start_int - 1
      start_int -= 1
    b = start_int

    #...more code here

    semiperimeter = b + d
    return semiperimeter

#Let's use this function now!

#store
my_val = input("Enter a value: ")

my_number = find_number(my_val)

print my_number

Существует множество вводных руководств по Python, и я бы посоветовал вам сначала ознакомиться с ними, прежде чем приступать к реализации такой проблемы. Если вы уже знаете, как программировать на другом языке, вы можете просто просмотреть руководство по синтаксису Python.

Не забудьте выбрать этот ответ, если он помог!

from math import sqrt, floor

def A063655(n):
    for i in range(floor(sqrt(n)), 0, -1):
        j = floor(n / i)
        if i * j == n:
            return i + j

if __name__ == '__main__':

    my_value = int(input("Enter a value: "))

    my_number = A063655(my_value)

    print(my_number)

ИСПОЛЬЗОВАНИЕ

> python3 test.py
Enter a value: 10
7
> python3 test.py
Enter a value: 350000
1185
> 
Другие вопросы по тегам