题目描述:设计一个算法,判断给定的一个数n是否是某个数的平方,不能使用开放运算。
分析与解答:
方法一:直接计算法
由于不能使用开方运算,因此最直接的方法就是计算平方。主要思路为:对1到n的每个数i,计算它的平方m,如果m<n,那么继续遍历下一个值(i+1),如果m == n ,那么说明n是某个数的平方,如果m>n,那么n不能表示成某个数的平方。
def isPower(n):
if n <= 0:
print(n+"不是自然数")
return False
i = 1
while i < n:
m = i * i
if m == n:
return True
elif m > n:
return False
i += 1
return False
if __name__ == "__main__":
n1 = 15
n2 = 16
if isPower(n1):
print(str(n1)+"是某个自然数的平方")
else:
print(str(n1)+"不是某个自然数的平方")
if isPower(n2):
print(str(n2)+"是某个自然数的平方")
else:
print(str(n2)+"不是某个自然数的平方")
方法二:二分查找法
与方法一类似,这种方法的主要思路还是查找从1~n的数字中看,是否存在一个数m,使得m的平方为n.不过在查找的过程中使用了二分查找的方法。具体的思路为:首先判断mid = (1+n)/2的平方power与m的大小,如果power >m ,那么说明在[1, mid-1]区间继续查找,否则在[mid+1, n]的区间继续查找。
def isPower(n):
low = 1
high = n
while low < high:
mid = (low + high) / 2
power = mid * mid
# 接着在1~mid -1 区间查找
if power > n:
high = mid - 1
elif power < n:
low = mid + 1
else:
return True
return False
方法三:减法运算法
def isPower(n):
minus = 1
while n > 0:
n = n - minus
# n 是某个数的平方
if n == 0:
return True
# n 不是某个数的平方
elif n < 0:
return False
# 每次减数都加2
else:
minus += 2
return False