想象一下我们有例如我们记忆中的1000位字。我想知道是否有办法计算它的平方根(不一定准确,假设没有浮点部分)。或者我们只有内存位置,后来指定了各种大小。
我假设我们的大数是一个数组(开头的最高位?)。平方根或多或少是原始数字的一半。当尝试使用逐位数算法时,有一个点,当指定long long不足以记住部分结果(使用01扩展数减法)。怎么解决?如何获得大数字的单个数字?只有位掩码?
在思考伪代码时,他们仍然坚持这个问题。有什么想法吗?
答案 0 :(得分:1)
你怎么用手工做?你如何手动将1000位数字除以500位? (想想这个方法,显然会非常耗费时间)。现在有一个平方根,这个方法非常类似于你猜测"第一个数字,然后是第二个数字,依此类推并减去事物。只是对于平方根,你减去稍微不同的东西(但不是 不同,计算平方根可以用非常类似于除法的方式完成,除了每个数字补充说,除数改变了)。
我不想告诉你究竟该怎么做,因为这会破坏你自己发现它的乐趣。
诀窍是:不要考虑x的平方根,而是考虑找到一个数y,使y * y = x。当你改进y时,用最小的努力重新计算x - y * y。
答案 1 :(得分:1)
使用二进制搜索算法可以非常轻松地计算平方根。
伪码算法:
c
:1000位值除以2(简单位移)。 c
和上限之间。c
之间。这种算法应该在log (N)
时间内运行。
答案 2 :(得分:1)
取决于你想要它的准确程度。考虑2 ^ 32 = 2 ^ 16的平方根。所以你可以做的一件事是将1000位数字500位向右移动,你得到的答案就是在球场上。
这有多好?让我们来看看。二进制数36是100100.如果我将它移到右边的3位,那么我得到4.嗯...应该是6.相当大的错误是33%。 1,000,000的平方根是1,000。在二进制中,1,000,000是1111 0100 0010 0100 0000
。这是20位。右移10位,它是1111 0100 00
或976.错误是24/1000,或2.4%。
当你得到一个1,000位的数字时,绝对错误可能很大,但百分比错误将会非常小。
根据您存储数字的方式,将1000位数字向右移动500位应该不会非常困难。
答案 3 :(得分:0)
牛顿的方法可能就是这样。在牛顿方法的某些时候,你将不得不进行除法(特别是在找到下一个要测试的点时),但是将它近似到最接近的2的幂可能是可以的,而只是做一个位移。