如何划分大数字?

时间:2009-06-19 17:21:16

标签: c largenumber

我有一个大数字(整数,无符号)存储在2个变量中(如你所见,数字的高低部分):

unsigned long long int high;
unsigned long long int low;

我知道如何添加或减去其他那种变量。

但我需要划分那种数字。怎么做?我知道,我可以减去N次,但也许有更好的解决方案。 ; - )

语言:C

9 个答案:

答案 0 :(得分:6)

是。它将涉及转移,我不建议在C中执行此操作。这是一个罕见的例子,汇编程序仍然可以证明其价值,轻松使事情运行速度提高数百倍(我不认为我夸大其词这个。)

我没有声称完全正确,但以下内容应该让你去:

(1)将结果初始化为零。

(2)将除数尽可能多地向左移位,而不会让它变得大于被除数。

(3)从被除数中减去转移的除数,并将结果加1。

(4)现在将除数向右移动直到再次,它小于剩余的被除数,并且对于每个右移,左移结果为一位。除非停止条件满足,否则返回(3)。 (停止条件必须是“除数已经变为零”,但我不确定。)

回到一些真正的编程问题真的很棒: - )

答案 1 :(得分:2)

您是否查看过任何大型库,例如GNU MP BigNum

答案 2 :(得分:2)

  

我知道,我可以减去N次,但也许还有更好的解决方案。

当N很大时,减去N次可能会很慢。

更好(即更复杂但更快)将使用您在小学时学会做long division十进制数的算法进行移位和减法。

[此类号码可能还有第三方库和/或编译器特定的支持。]

答案 3 :(得分:0)

嗯。我想如果你有一个“高”的余量,你可以将它全部向上移动一位数,将数字除以高,然后将余数加到低位的最高位数并将数字除以低,然后将所有数据移回。

答案 4 :(得分:0)

根据我的评论者,我之前的回答是愚蠢的。

很快,我的新答案是,当我过去尝试这样做时,它几乎总是涉及转移,因为它是唯一可以应用于多个“单词”的操作,如果你愿意,并且有它看起来就好像是一个大字(除了必须跟踪残留位)。

有几种不同的方法,但除了你的硬件有一些特殊的操作外,我不知道比使用移位有更好的总体方向。

答案 5 :(得分:0)

这是另一个执行128位算术的库。 GnuCash: Math128

答案 6 :(得分:0)

您可以实现一个“BigInt”类型算法,对字符串数组进行分割。为每个高,低对创建1个字符串数组并进行除法。将结果存储在另一个字符串数组中,然后转换回高,低整数对。

由于语言是C,因此数组可能是一个字符数组。考虑它类似于我上面提到的“字符串数组”。

答案 7 :(得分:0)

您可以使用汇编程序循环和“使用进位(adc / sbb)添加/减去”指令来添加和减少任意大的二进制对象。您可以使用它们实现其他操作。我从来没有调查过除了这两个人以外的任何事情。

答案 8 :(得分:0)

如果你的处理器(或你的C库)具有快速的64位除法,你可以将128位除法分成几部分(就像在具有16位的处理器上进行32位除法一样)师)。

顺便说一句,如果您知道红利和除数的典型值,您可以使用各种技巧。这些数字的来源是什么?如果您的很多案例可以快速解决,那么偶尔的案例可能会花费很长时间。

此外,如果您能找到大致答案正常的情况,那么这将为大量快速近似打开大门。