Tag: 完美的广场

最快的方法来确定一个整数的平方根是一个整数

我正在寻找最快的方式来确定一个long价值是一个完美的平方(即其平方根是另一个整数)。 我已经通过使用内置的Math.sqrt()函数,简单的方法做到了这一点,但是我想知道是否有办法通过将自己限制为只有整数的域来更快地实现。 维护一个查找表是不切实际的(因为大约有2 31.5个整数的平方小于2 63 )。 这是我现在正在做的非常简单直接的方式: public final static boolean isPerfectSquare(long n) { if (n < 0) return false; long tst = (long)(Math.sqrt(n) + 0.5); return tst*tst == n; } 注意:我在许多Project Euler问题中使用了这个函数。 所以没有人会永远保持这个代码。 而这种微观优化实际上可能会有所作为,因为部分挑战是在不到一分钟的时间内完成每一个algorithm,而这个function在一些问题上需要被调用数百万次。 更新2 :由A. Rex发布的新解决scheme已被certificate更快。 在前10亿个整数的运行中,解决scheme只需要使用原始解决scheme的34%。 虽然John Carmack对n的小值有点更好,但与此解决scheme相比,其好处却相当小。 A. Rex解决scheme转换为Java: private final static boolean isPerfectSquare(long n) { // Quickfail if( n < […]