在Python中生成并输入OEIS序列的值



这对我来说是一个相当困难的挑战,因为我是Python的新手。我该如何在基于以下序列函数的python中编写程序:

http://oeis.org/A063655

并执行以下操作:

它询问序列的值并返回相应的数字。例如,与序列的第10个值相对应的数字是7。我希望能够在价值超过30000000的情况下做到这一点。

所以,最终的产品看起来是这样的:

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

如果你想让你的计算机跟踪一个序列中超过30000000个元素,如果每个元素都是4字节的整数,你需要至少30000000*4字节,或者超过1.1GB的空间来存储所有值。我认为生成序列也需要很长时间,所以每次用户想要一个值时再次生成整个序列也不是很理想。我有点困惑,你到底是怎么想的。

从用户那里获取值很简单:您可以使用val = input("What is your value? "),其中val是存储值的变量

编辑:

这似乎是一种快速而简单的方法,每个值都有合理的步骤数(除非值是素数……但让我们暂时保持概念简单(:你需要一个小于或等于n的平方根的整数(start_int = n ** .5(,然后你测试下面的每个整数,看看它是否除以n,首先用start_int = int(start_int)start_int转换为整数(这为start_int提供了底数(,如下所示:while (n % start_int) != 0: start_int = start_int - 1,递减一,然后设置b = start_int。类似于查找d,但您必须找出该部分。注意,%是模运算符(如果你不知道它是什么,你可以阅读它,谷歌:"modulus python"(,**是幂运算。然后可以使用return语句返回一个值。您的函数看起来像这样(以#开头的行是注释,python跳过它们(:

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
> 

最新更新