我有这个python代码:
def sqrt(x):
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans + 1
if ans*ans != x:
print x, 'is not a perfect square.'
return None
else:
print x, ' is a perfect square.'
return ans
else:
print x, ' is not a positive number.'
return None
y = 16
sqrt(y)
输出是:
16 is not a perfect square.
虽然这完美无缺:
x = 16
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans + 1
#print 'ans =', ans
if ans*ans != x:
print x, 'is not a perfect square'
else: print ans, 'is a perfect square'
else: print x, 'is not a positive number'
我做错了什么?
答案 0 :(得分:10)
我想我会提供一个更简单的解决方案:
def is_square(n):
return sqrt(n).is_integer()
这适用于n < 2**52 + 2**27 = 4503599761588224
。
示例:
>>> is_square(4)
True
>>> is_square(123)
False
>>> is_square(123123123432**2)
True
答案 1 :(得分:7)
正确缩进代码,让while
语句执行到ans*ans < x
:
def sqrt(x):
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans + 1
if ans*ans != x: # this if statement was nested inside the while
print x, 'is not a perfect square.'
return None
else:
print x, ' is a perfect square.'
return ans
else:
print x, ' is not a positive number.'
return None
y = 16
print sqrt(y)
尝试here。
答案 2 :(得分:1)
您的while
循环只执行一次。无论它内部的if
语句采用哪个分支,整个函数都会立即返回。
答案 3 :(得分:0)
编辑我修改了它,试了一下,然后就可以了。你只需要这段代码
一旦ans = 4,ans * ans就不再小于x。尝试ans * ans&lt; = x:而不仅仅是&lt;
def sqrt(x):
ans = 0
if x >= 0:
while ans*ans <= x:
if ans*ans == x:
print x, ' is a perfect square.'
return ans
else:
ans = ans + 1
答案 4 :(得分:0)
更改您的代码,使其显示ans
以及x
的值,以便您可以判断循环的执行次数。
答案 5 :(得分:0)
如果您的代码示例实际上是正确的,那么第一轮的while将在第一轮返回 - 总是。因此,x> 1的任何正值都将满足ans * ans = 1 * 1 = 1!= x,给出“x不是完美的正方形”。
你基本上需要让你的缩进正确 - 就像你在其他例子中所做的那样。再次 - 如果您的代码示例实际上是正确缩进的。试试这个:
def sqrt(x):
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans + 1
if ans*ans != x:
print x, 'is not a perfect square.'
return None
else:
print x, ' is a perfect square.'
return ans
else:
print x, ' is not a positive number.'
return None
答案 6 :(得分:0)
def isPerfectSquare(number):
return len(str(math.sqrt(number)).split('.')[1]) == 1
答案 7 :(得分:0)
我认为这可能很短暂。
def issquare():
return (m**.5 - int(m**.5)==0)
答案 8 :(得分:-1)
如果目标是确定一个数字是否是一个完美的正方形,我认为使用数学内置函数会更简单(也许更有效),例如:
def is_perfect_square(n):
if not ( ( isinstance(n, int) or isinstance(n, long) ) and ( n >= 0 ) ):
return False
else:
return math.sqrt(n) == math.trunc(math.sqrt(n))