2013-03-31 12 views
0

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

ответ

1

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

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

EDIT:.

Похоже, быстрый и простой подход был бы таким образом, , с разумным количеством шагов для каждого значения (если значение не является простым ... но позволяет сохранить концепцию простой на данный момент): вам понадобится целое число, меньшее или равное квадратному корню из 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.

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

+0

Это хорошая точка о хранении всех тех ценностей, которые были бы очень много места.Теперь мой вопрос будет следующим: как программа может вернуть число на основе указанной переменной без создания сгенерированной последовательности? Мне понадобится структура, как, например, генерировать последовательность. – 23534260402

+0

Кроме того, вот часть согласно oeis.org, которая объясняет эту функцию: «Полупериметр b + d, d> = b, квадратного прямоугольника с квадратом (наименьший db) с областью bd = n. То есть b = наибольший делитель n <= sqrt (n), d = наименьший делитель n> = sqrt (n). " Итак, как эта функция может вернуть указанное число, соответствующее значению неподготовленной последовательности? – 23534260402

+0

Кажется, что элементы последовательности могут быть рассчитаны без ссылки на предыдущие элементы последовательности. См. Мой ответ выше. –

0
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 
>