2013-05-07 54 views

回答

13

一种方法是

int(math.sqrt(x)) ** 2 == x 
7

因为math.sqrt总是返回一个浮点数,你可以使用内置的is_integer方法

def is_square(x): 
    answer = math.sqrt(x) 
    return answer.is_integer() 

这将返回True如果x是一个正方形和False如果它不是

>>> is_square(25) 
True 
>>> is_square(14) 
False 
+0

嗯。由于在计算过程中出现四舍五入错误,将浮点数视为不精确,是否会发生方数的sqrt()最终不会成为整数?这会让@ larsmans的回答更好。 – millimoose 2013-05-07 18:54:24

+0

这是一个有效的点,但我只是运行了一个for循环,使用这种方法可以打印出所有有效的正方形高达100,000,并且它不会错过任何一个。 – 2013-05-07 19:04:10

+0

整数完全以浮点形式表示(它们在点之后全部为零)。不过,我不确定'sqrt'是否可以保证这一点。 – 2013-05-07 19:18:59

1

尝试:

math.sqrt(nodes) == int(math.sqrt(nodes)) 
+0

这将不起作用,因为浮标的不精确性。如果'math.sqrt(节点)'和'int(math.sqrt(节点))'之间的差异大于'sys.float_info.epsilon',那么你运气不好。 – MattDMo 2013-05-07 19:06:49

+0

你的意思是_smaller_比'sys.float_info.epsilon'吗?否则我很困惑... – 2013-05-07 19:19:23

+0

更大。如果差值大于ε,则系统认为它们不相等,并且表达式返回“False”。 – MattDMo 2013-05-07 20:35:06

相关问题