我要问的不是这个非常流行的问题的重复。对于随机选择的输入,可以进行一些快速测试,如果他们没有说“不是平方”,则必须进行平方根的一些计算(我自己也尝试了一个解决方案)。
当要测试的数字来自一个简单的序列时,情况会有所不同,因为可以使用前一个(近似)平方根。对于一个微不足道的序列,它也是微不足道的,例如,
long sqrt = 1;
for (long i=1; i<limit; ++i) {
if (sqrt*sqrt == i) {
handleSquare(i);
++sqrt;
}
}
我的问题是对于更复杂的序列可以做些什么,比如
x[i] = start + i*i;
或者
x[i] = start - i*i*i;
我正在考虑牛顿的方法,但我不知道如何让它快速(因为除法是一项非常昂贵的操作)。