我正在寻找最快的方法来确定long
值是否是一个完美的平方(即它的平方根是另一个整数):
Math.sqrt()
功能,但我想知道是否有一种方法可以更快地做到这一点将自己限制为仅整数域。这是我现在正在做的非常简单和直接的方法:
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问题中使用了这个函数。所以没有其他人需要维护这段代码。这种微优化实际上可以产生影响,因为挑战的一部分是在一分钟内完成每个算法,而且在某些问题中这个函数需要被调用数百万次。
我尝试了这个问题的不同解决方案:
0.5
是没有必要的,至少在我的机器上是没有必要的。Math.sqrt()
慢一点。这可能是因为Math.sqrt()
使用了类似于牛顿方法的东西,但在硬件中实现,所以它比Java快得多。此外,牛顿方法仍然需要使用双精度。Math.sqrt()
慢。or
语句在C++比使用switch
更快,但在Java和C#中,or
和switch
似乎没有区别。if(lookup[(int)(n&0x3F)]) { test } else return false;
,而不是Switch或or
语句。令我惊讶的是,这(只是稍微)慢了一点。这是因为数组边界检查Java。