我想实现一个能够处理真正大数字的BigInt类。我只想添加和乘以数字,但是类也应该处理负数。
我想将数字表示为字符串,但将字符串转换为int并返回以进行添加会产生很大的开销。我想在高中实施添加,添加相应的顺序,如果结果大于10,则将进位添加到下一个顺序。
然后我认为最好将它作为一个unsigned long long int数组处理,并保持符号由bool分隔。有了这个我害怕int的大小,就我所知,C ++标准只保证int<漂浮<双。如我错了请纠正我。因此,当我达到某个数字时,我应该向前移动数组并开始向下一个数组位置添加数字。
是否有适合或更好的数据结构?
答案 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_t
和uint64_t
,因此您可以避免使用与平台相关的整数类型。或者,(如果您的平台不提供这些),您可以自己即兴创作和定义此类内容 - 最好是在单独的"platform_dependent.h"
文件中...