【发布时间】: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