Python完全平方数判断函数Bug修复:误判4/25为非平方数问题
修复完全平方数判断函数的逻辑错误
嘿,我一眼就瞅见你代码里的问题啦!
你的核心问题出在for循环里的else语句位置:当前代码里,每次循环只要i*i不等于n,就立刻返回False。拿输入4举例,第一次循环i=0,0²≠4,直接就返回False了——根本没机会让i走到2这个正确值!这就是为什么加了else后4和25会被误判的原因。
修复方案一:调整循环逻辑
把else从循环内的if分支里移出来,只有当整个循环跑完、所有可能的i都试过都不匹配时,才返回False。另外还可以优化循环范围,不用从0遍历到n,因为一个数的平方根最大不会超过它的一半(n>1时),或者直接取到sqrt(n)+1,这样效率更高:
def is_square(n): if n < 0: return False # 0和1都是完全平方数,直接返回True if n == 0 or n == 1: return True # 只循环到n的平方根整数部分+1,减少不必要的遍历 for i in range(2, int(n**0.5) + 1): if i * i == n: return True # 整个循环结束都没找到匹配的i,说明不是完全平方数 return False
测试一下:输入25时,i会走到5,5²=25,直接返回True;输入27时,循环到5(因为sqrt(27)≈5.196,取整后是5,+1后循环到6),所有i的平方都不等于27,最后返回False,完美符合你的需求。
修复方案二:更简洁的数学验证法
其实不用循环也能搞定,直接计算n的平方根取整,再验证这个整数的平方是否等于n:
def is_square(n): if n < 0: return False root = int(n**0.5) return root * root == n
这个方法效率更高,尤其当n很大的时候,不用遍历大量数值。比如输入27时,int(27**0.5)=5,5²=25≠27,返回False;输入25时,int(25**0.5)=5,5²=25,返回True,完全满足要求。
内容的提问来源于stack exchange,提问作者accelerate




