【发布时间】:2015-07-05 08:22:28
【问题描述】:
我要问的不是this very popular question 的重复。对于随机选择的输入,可以进行一些快速测试,如果它们未能说出“不是平方”,则必须进行平方根的计算(我自己也尝试过 solution)。
当要测试的数字来自一个简单的序列时,情况会有所不同,因为可以使用前一个(近似)平方根。对于微不足道的序列,它也是微不足道的,例如,
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;
我正在考虑牛顿的方法,但我不知道如何使其快速(因为除法是一项非常昂贵的操作)。
【问题讨论】:
-
我认为您的“琐碎”示例有点太琐碎。从这个角度想:一个完全平方数的平方根是有理数;也就是说,数字没有小数部分。
-
@Makoto 对,这太微不足道了,因为每个人都会转而循环
sqrt。但是忘记它,这个想法是在迭代之间保留一些信息会有所帮助。
标签: java math optimization perfect-square