【问题标题】:What data structure should I use for BigInt class我应该为 BigInt 类使用什么数据结构
【发布时间】:2012-03-30 12:06:47
【问题描述】:

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

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

然后我认为最好将其作为 unsigned long long int 的数组处理并保持符号由 bool 分隔。有了这个我害怕int的大小,据我所知,C++标准只保证int

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

【问题讨论】:

  • 对我来说听起来像是一个合理的实现。但是,如果您使用 ULONG,则数组中的每个元素都可以保存从 0 到 2^32-1 的值,而不是从 0 到 10。这应该可以节省一些字节。 :-)
  • 标准只保证float <= double(注意等号)
  • 是的,这正是我的意思。但是 2^32 - 1 在 linux 和 solaris 上是否相同?各个地方的尺寸都有保证吗?我的意思是,例如我得到 MyBigIntClass number = "234567434256547"; ,然后我开始将此字符串编号转换为我在类中的内部表示形式,即 usigned long long int(maybe :-) ),并且在数字达到 2^32 后,我移动到数组中的另一个位置。对吗?
  • 对负数使用 2 补码,而不是符号位。这样您就不需要专门处理有符号算术。此外,如果您这样做是为了个人乐趣,那么请继续(编写一个 bigint 类有趣,尤其是通过 FFT 进行乘法和使用 Newton 方法进行除法)。如果您只需要一个有效的 bigint 类,请查看优秀的 Gnu MP 库(以及相关的 MPFR)。
  • 我把它当作家庭作业。希望我不需要除法:-)

标签: c++ math data-structures biginteger


【解决方案1】:

那么,您想要一个已知大小的动态整数数组吗?

听起来像vector<uint32_t> 应该适合你。

【讨论】:

  • 很遗憾不允许使用 STL
  • 家庭作业?嵌入式?在任何情况下,您都需要vector 之类的东西。幸运的是,重新创建一个基本的“动态数组”是一个简单的练习。
【解决方案2】:

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

【讨论】:

  • 加减法,carry可以在途中完成,不需要两次pass。对于乘法,它取决于算法,但如果你使用例如。浮点 FFT 方法,您也不需要进位(但最好使用 16 位“数字”,因为您会在 FFT 期间累积舍入误差)。
【解决方案3】:

在现代的 64 位 x86 平台上,最好的方法可能是将您的 bigint 存储为一个动态分配的无符号 32 位整数数组,以便您的算术可以适应 64 位。您可以单独处理您的符号,作为类的成员变量,或者您可以使用 2 的补码算法(这是 signed int 的典型表示方式)。

标准 C <stdint.h> 包含文件定义了 uint32_tuint64_t,因此您可以避免依赖于平台的整数类型。或者,(如果您的平台不提供这些),您可以自己即兴创作和定义这种东西——最好在单独的"platform_dependent.h" 文件中...

【讨论】:

  • 2-s 补码对于动态长度 bigints 来说并不容易(而且不会买太多),但我同意其余的。
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多