繁体   English   中英

如何划分大数字?

[英]How to divide big numbers?

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

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

我知道如何添加或减去其他一些变量。

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

语言:C

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

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

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

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

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

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

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

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

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

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

更好(即更复杂但更快)将使用您学习的算法在小学中进行长数除法

[可能还有第三方库和/或编译器特定的支持这些数字。]

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

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

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

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

这是另一个进行128位运算的库。 GnuCash:Math128

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

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

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

如果您的处理器(或C库)具有快速的64位除法,则可以将128位除法分解为多个(与在具有16位除法的处理器上进行32位除法的方式相同)。

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

此外,如果你能找到一个大概的答案是正确的情况,那就打开了很多快速近似的大门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM