自用笔记42——牛顿迭代法完全平方数性质

it2025-06-04  8

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。

说明:不要使用任何内置的库函数,如 sqrt。

示例 1:

输入:16 输出:True 示例 2:

输入:14 输出:False

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-perfect-square 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这里有大概四种方法处理这个问题,第一种暴力无脑循环:

class Solution: def isPerfectSquare(self, num: int) -> bool: i = 1 while i * i < num: i += 1 return i * i == num;

首先i从1开始,判断这个数是不是i的平方 不是的话,i 每次加1 直到超过了num 第二种在第一种思路上优化一下,使用老朋友二分查找:

class Solution: def isPerfectSquare(self, num: int) -> bool: if num < 2: return True left, right = 2, num // 2 while left <= right: x = left + (right - left) // 2 guess_squared = x * x if guess_squared == num: return True if guess_squared > num: right = x - 1 else: left = x + 1 return False

第三种,运用完全平方数的性质: 任意一个平方数可以表示成这样的奇数序列和:

bool isPerfectSquare(int num){ unsigned int n=num,i=1; for(i=1;i<=num;i+=2) { n=n-i; if(n==0) return true; } return false; }

第四种就是牛顿迭代法

bool isPerfectSquare(int num){ int lastnum=4,newnum=0,lastguess=0,newguess=0,count=0; lastguess=lastnum; while(lastguess!=newguess) { lastguess=lastnum; newnum=(int)(lastnum+(int)(num/lastnum))/2; newguess=newnum; lastnum=newnum; count++; if(count>20) return false; } if(newguess*newguess==num) return true; else return false; }

这是我的笨比牛顿迭代法,这是简洁版的:

class Solution: def isPerfectSquare(self, num: int) -> bool: i = num while i * i > num: i = (i + num / i) // 2 return i * i == num

牛顿迭代法也是sqrt()函数的一种原理

最新回复(0)