【问题标题】:How do you do computations on numbers with unlimited numbers of bits? [duplicate]您如何对具有无限位数的数字进行计算? [复制]
【发布时间】:2013-06-28 21:55:47
【问题描述】:

在 C 中,你可以执行一个简单的:

int a = b + c;

现在,如果a 大于 2^32(或者可能是 2^31+1),您可以将代码更改为:

long a = b + c;

unsigned long a = b + c;

但是你将如何实现加法:

bigint a = b + c;

其中 bigint 是某种类/typedef/结构,用于存储和计算大整数(数百位数长的数字)。如果您只是尝试使用小学时的标准手写十进制方法将数字相加,您可以在等式中计算无限长的数字。但是回到计算机科学,如何使用二进制、高效的方法来进行无限长的计算(只要有足够的 RAM 可用)

更重要的是,有没有一种方法不是很慢?

【问题讨论】:

标签: c++ c biginteger


【解决方案1】:

您可以使用 bigint library,或者如果您真的有野心,您可以创建一个动态数组来存储您的整数。

【讨论】:

    【解决方案2】:

    有非常快速的方法可以做到这一点(请注意,仍然比 CPU 寄存器中的数学要慢)。这方面的库已经存在,但如果您对实现细节感兴趣,我建议您查看 GMP 的源代码 (http://gmplib.org/),以及阅读(并中进行练习)Knuth 的 计算机编程艺术,第 2 卷:半数值算法。

    【讨论】:

      【解决方案3】:

      “更重要的是,有没有一种方法不是很慢?”

      与固定长度、16、32、64 以及在某些机器中的 128 位相比,它都非常慢,因为数学必须分小步完成。加法和减法并不算太糟糕,阵列中每个单元只有一到两个时钟周期(32 位或 64 位,具体取决于架构),但乘法和除法确实变得很慢。随着数字变得非常大(超过几千位左右),您还会遇到缓存未命中问题,这会减慢计算速度。

      但是你当然可以比在 ascii 字符串中存储数字更好一些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多