如何对位数不受限制的数字进行计算
How do you do computations on numbers with unlimited numbers of bits?
在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可用)
更重要的是,有没有一种方法可以做到这一点,而不是非常缓慢?
您可以使用bigint库,或者如果您真的有野心,可以创建一个动态数组来存储整数。
有非常快速的方法可以做到这一点(请注意,这比CPU寄存器中的数学运算还要慢)。这方面的库已经存在,但如果你对实施细节感兴趣,我建议你检查GMP的源代码(http://gmplib.org/),以及阅读(和中的练习)Knuth的《计算机编程艺术》,第2卷:半数值算法。
"更重要的是,有没有一种方法可以做到这一点,速度不会非常慢?"
与固定长度的16、32、64以及某些机器中的128位相比,这一切都会非常缓慢,因为数学运算必须循序渐进。加法和减法还不错,阵列中每个单元只有一到两个时钟周期(32或64位取决于架构),但乘法和除法确实会变得很慢。当数字变得非常大(超过几千位左右)时,还会遇到缓存未命中的问题,这会减慢计算速度。
但是,您肯定可以获得比将数字存储在ascii字符串中更好的效果。
相关文章:
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 计算十进制 c++ 之后的数字
- 我可以通过取每个数字的模并取和来计算大数的模数吗?
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 如何在向量中某个数字之后重新计算进程
- 如何计算整数的十进制数字?
- 如何使用count_if计算向量中的可变数字范围
- 如何计算整数链中使用了多少次数字?
- 如何计算给定数字在二叉树中出现的次数?
- C++在不使用pow或循环的情况下计算一个数字的幂
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- 如何使用递归计算从 0 到给定数字的奇数?
- 在手臂氖中高效计算两个不同的数字
- 如何将此代码转换为两个以上的数字(计算HCF)
- 相同数字计算的怪异结果差异
- 用非常大的数字计算
- 猜数字:计算机要猜多少次才能得到正确的数字
- 从给定的数字计算所有可能的数字
- 根据存储在集合中的数字计算向量中的int