判断一个数是否是平方数

这是一个比较简单的问题 但是存在一些需要注意的地方

首先我们可以选取二分法的方式来简单的实现这个算法,虽然 Math中有相应的log 函数  但是我觉得二分法的 log2(n) 的效率也不会比他差

另外一点就是二分法中的检查逻辑,一种很直观的逻辑是 直接将中间数的平方数算出来,然后和需要判断的值比较,然后得到结果,

    这一点就是我写这篇博客的主要原因,在使用任何数据类型的时候 我们都要考虑数据的取值范围问题以及数据取值,比如我们常用的int  的取值范围是

    -2147483648 -- 2147483647 ,比如Float.MINVALUE 的值是大于0的,  这些都是我们需要考虑的


  所以我们在对中间值平方的过程中 可能出现溢出的现象, 联系加法器的原理,溢出部分的01值是直接被抹去的,所以会出现一个数的平方变成负值

  或者比本身小的情况

  

  这样的情况怎么处理掉呢,   2种思路,  1计算出int 范围内 最大的算数平方根   将这个数硬编码进程序 然后所有的中间值需要先于这个数比较

                                                                          2 用除法操作 掩盖掉溢出的情况


public class Square {

	public static void main(String[] args) {
		System.out.println(Square.isSquare(9859600));
	}

	// 需要考虑 溢出的情况 所以用除法规避溢出 然后检查
	// 当然数据量大的话 可以采取先将Interger 最大算数平方根求出来 然后之后的数 先与这个数比较然后用乘法检查
	public static boolean isSquare(int n) {
		if (n <= 0) {
			return false;
		}
		int low = 1;
		int high = n;
		int mid = (low + high) >> 1;
		while (low <= high) {
			int temp = n / mid;
			if (mid == temp && n == mid * temp) {
				return true;
			}
			if (temp < mid) {
				high = mid - 1;
			}
			if (temp >= mid) {
				low = mid + 1;
			}
			mid = (low + high) >> 1;
		}
		return false; // fix me!
	}
}


你可能感兴趣的:(ACM)