我正在尝试写一张支票,以确定数字是否为五角形。五边形数字是由公式生成的数字:





PN = N(3N-1)/ 2


即。第一个五边形数字是:





1,5,12,22,35,51,70,92,117,145,......


我的当答案应 True 时,代码会抛出 False ,所以这显然不正确,但我很难理解为什么。它如下:


 来自math import sqrt
 def is_pent(n):
 ans = any((x *((3 * x)-1))/ 2 == n for x in range(int(sqrt(n))))
返回



 我会感谢你的帮助!

答案 0 :(得分:7)
根据Wikipedia,要测试正整数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()
答案 1 :(得分:2)
你的代码不起作用的原因是你是否正在减少测试过多的整数范围。有意义的是减少它(使用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中提出的
答案 2 :(得分:1)
您可以使用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"