我有一个大数字(整数,无符号)存储在2个变量中(如你所见,数字的高低部分):
unsigned long long int high;
unsigned long long int low;
我知道如何添加或减去其他那种变量。
但我需要划分那种数字。怎么做?我知道,我可以减去N次,但也许有更好的解决方案。 ; - )
语言:C
答案 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位除法一样)师)。
顺便说一句,如果您知道红利和除数的典型值,您可以使用各种技巧。这些数字的来源是什么?如果您的很多案例可以快速解决,那么偶尔的案例可能会花费很长时间。
此外,如果您能找到大致答案正常的情况,那么这将为大量快速近似打开大门。