我正在用java编写一个程序,用于计算给定值的sqrt,最大为10 ^ 100 。为此,我知道我必须使用BigInteger,但我处理的过程效率不高,因为它需要花费很多时间。分解数字来处理程序的最快过程是什么?什么是更快的算法?
提前致谢。
答案 0 :(得分:0)
首先,我希望您意识到大多数输入值都没有平方根的精确整数答案!你确定要用BigInteger而不是BigDecimal吗?
你确定不希望迭代每个值到n。您需要一种方法来更快地改善您的答案。一个简单的方法是对平方根的值进行初始猜测(我推荐n / 2),并找到它的辅因子(n / guess)。如果它们相等就完成了,如果它们不相等,则将猜测更新为猜测的平均值及其辅助因子 - 其中一个将大于实际的平方根,另一个将是因此,平均值会产生更接近实际平方根的值。泡沫,冲洗,重复。如果没有精确的平方根,则当因子和辅因子在1之间时停止。
附录:这里是伪代码(实际上是Ruby,但这几乎是一样的):
def sqrt(n)
guess = n / 2
cofactor = 2
loop do
cofactor = n / guess
break if (guess - cofactor).abs <= 1
guess = (guess + cofactor) / 2
end
return [guess, cofactor].min
end
翻译到Java应该非常简单。