题目描述:设计一个算法,判断给定的一个数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
文章来源: https://blog.csdn.net/qq_42013574/article/details/88851860