Создать и ввести значение для последовательности OEIS в Python?
Это довольно сложная задача для меня, так как я новичок в Python. Как бы я написал программу на Python, основанную на этой функции последовательности:
и делает следующее:
Он запрашивает значение последовательности и возвращает соответствующий номер. Например, число, соответствующее 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
>