我应该为BigInt类使用什么数据结构

时间:2012-03-30 12:06:47

标签: c++ math data-structures biginteger

我想实现一个能够处理真正大数字的BigInt类。我只想添加和乘以数字,但是类也应该处理负数。

我想将数字表示为字符串,但将字符串转换为int并返回以进行添加会产生很大的开销。我想在高中实施添加,添加相应的顺序,如果结果大于10,则将进位添加到下一个顺序。

然后我认为最好将它作为一个unsigned long long int数组处理,并保持符号由bool分隔。有了这个我害怕int的大小,就我所知,C ++标准只保证int<漂浮<双。如我错了请纠正我。因此,当我达到某个数字时,我应该向前移动数组并开始向下一个数组位置添加数字。

是否有适合或更好的数据结构?

3 个答案:

答案 0 :(得分:5)

那么,你想要一个众所周知的大小的动态数组?

vector<uint32_t>之类的声音对您有用。

答案 1 :(得分:2)

正如您已经发现的那样,您需要在平台中使用特定类型(如果您有C ++ 11,则使用具有固定大小的语言)。大数字的常见实现将使用32位整数并确保仅设置低16位。这使您可以对数字(其中数字为[0..2 ^ 16))进行操作,然后通过应用结转来标准化结果。

答案 2 :(得分:2)

在现代的64位x86平台上,最好的方法可能是将bigint存储为动态分配的无符号32位整数数组,因此算法可以适合64位。您可以单独处理您的符号,作为类的成员变量,或者您可以使用二进制补码算法(通常表示signed int的表示方式)。

标准C <stdint.h>包含文件定义uint32_tuint64_t,因此您可以避免使用与平台相关的整数类型。或者,(如果您的平台不提供这些),您可以自己即兴创作和定义此类内容 - 最好是在单独的"platform_dependent.h"文件中...