Python-是五边形数字检查吗

Python-是五边形数字检查吗,python,math,sequence,Python,Math,Sequence,我试图写一张支票来确定一个数字是否是五边形的。五边形数是由以下公式生成的数: Pn=n(3n−1) /2 i、 e.第一个五边形数为: 1、5、12、22、35、51、70、92、117、145 当答案应该是True时,我的代码抛出了False,因此它显然是不正确的,但我很难理解为什么。详情如下: from math import sqrt def is_pent(n): ans = any((x*((3*x)-1))/2 == n for x in range(int(sqrt(n))

我试图写一张支票来确定一个数字是否是五边形的。五边形数是由以下公式生成的数:

Pn=n(3n−1) /2

i、 e.第一个五边形数为:

1、5、12、22、35、51、70、92、117、145

当答案应该是True时,我的代码抛出了False,因此它显然是不正确的,但我很难理解为什么。详情如下:

from math import sqrt
def is_pent(n):
    ans = any((x*((3*x)-1))/2 == n for x in range(int(sqrt(n))))
    return ans
我会感谢你的帮助

根据,要测试正整数
x
是否为五边形数,可以检查
((sqrt(24*x)+1)+1)//6
是否为自然数。这样的方法应该适用于不是很大的整数:

from math import sqrt 

def is_pentagonal(n):
    k = (sqrt(24*n+1)+1)/6
    return k.is_integer()

代码不起作用的原因是,测试的整数范围太小了。减少它(使用
sqrt
)是很有趣的,但它会导致丢失一些值

相反,您可以增加测试范围:

#!/usr/bin/env python3

from math import sqrt

def is_pent(n):
    ans = any((x*((3*x)-1))/2 == n for x in range(int((n+1))))
    return ans

for i in range(500):
    if is_pent(i):
        print(str(i) + " is pentagonal")
测试输出:

$ ./test_script3.py
0 is pentagonal
1 is pentagonal
5 is pentagonal
12 is pentagonal
22 is pentagonal
35 is pentagonal
51 is pentagonal
70 is pentagonal
92 is pentagonal
117 is pentagonal
145 is pentagonal
176 is pentagonal
210 is pentagonal
247 is pentagonal
287 is pentagonal
330 is pentagonal
376 is pentagonal
425 is pentagonal
477 is pentagonal

编辑:当然,您最好使用较短的代码,如eugene y answer中所建议的您可以使用
fsolve
获取使用您的数字动态生成的方程的根。比如说

import numpy
from scipy.optimize import fsolve

def root(x,n):
    return ((3*x*x-x)/2)-n

n = 70 #number to check if pentagonal or not

function_root = fsolve(root,n/2,n)

if function_root == int(function_root):
    print "number is pentagonal number"

我认为这可能只是一个偏离上限的错误。您是否尝试过
范围(int(sqrt(n))+1)
?请注意,您也可以尝试二进制搜索,因为这些五边形数字似乎严格递增。请注意,
k
在Python 3中永远不会是整数,因为任何除法操作的结果都是浮点。在Python 2中它也不会是整数,这就是重点
is_integer()
是一种
float
的方法。啊,我没想到
1.0。is_integer()
会返回
True