计算C中1000+位字的平方根

时间:2014-04-06 12:50:13

标签: algorithm bit largenumber square-root integer-arithmetic

想象一下我们有例如我们记忆中的1000位字。我想知道是否有办法计算它的平方根(不一定准确,假设没有浮点部分)。或者我们只有内存位置,后来指定了各种大小。

我假设我们的大数是一个数组(开头的最高位?)。平方根或多或少是原始数字的一半。当尝试使用逐位数算法时,有一个点,当指定long long不足以记住部分结果(使用01扩展数减法)。怎么解决?如何获得大数字的单个数字?只有位掩码?

在思考伪代码时,他们仍然坚持这个问题。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

你怎么用手工做?你如何手动将1000位数字除以500位? (想想这个方法,显然会非常耗费时间)。现在有一个平方根,这个方法非常类似于你猜测"第一个数字,然后是第二个数字,依此类推并减去事物。只是对于平方根,你减去稍微不同的东西(但不是 不同,计算平方根可以用非常类似于除法的方式完成,除了每个数字补充说,除数改变了)。

我不想告诉你究竟该怎么做,因为这会破坏你自己发现它的乐趣。

诀窍是:不要考虑x的平方根,而是考虑找到一个数y,使y * y = x。当你改进y时,用最小的努力重新计算x - y * y。

答案 1 :(得分:1)

使用二进制搜索算法可以非常轻松地计算平方根。

伪码算法:

  • 猜一个c:1000位值除以2(简单位移)。
  • 正方形:
    • 如果广场(差不多)等于您的1000位数,那么您就得到了答案
    • 如果方块小于您的数字,则可以确定根位于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的幂可能是可以的,而只是做一个位移。