【问题标题】:Converting an arbitrary large number to base 256将任意大数转换为基数 256
【发布时间】:2012-01-06 13:15:40
【问题描述】:

我有一个非常大的数字,长度可能高达 50 位。我将其作为字符串输入。但是,我需要对其执行操作。因此,我需要将它们转换为适当的基数,比如说 256。

最好的算法是什么?

【问题讨论】:

  • 将其转换为基数 2,然后使用处理器执行您的算术有什么问题?
  • 无论如何,都有一个通用的基本转换算法。尝试谷歌搜索。
  • 增加基数将减少操作次数,我将需要我的添加
  • @Marcin 无论如何,你怎么能添加两个 50 位数字??
  • 处理器无论如何都使用二进制数。添加以基数 2 或基数 256(或任何您想要的)表示的数字不会改变任何事实,即您的数字大于计算机允许的最大数字。因此,请参阅 Basile 的回答。

标签: c algorithm long-integer


【解决方案1】:

多精度算术(又名bignums)是一个困难的主题,好的算法是不直观的(有关于这方面的书籍)。

存在几个处理 bignums 的库,例如GMP library(还有其他的)。他们中的大多数人通过精心调整的小块汇编代码从一些硬件指令(例如,带进位的加法)中获利。因此,它们的性能比您在几个月内编写的代码要好。

我强烈建议使用现有的 bignum 库。如果您希望它具有竞争力,自己编写将需要您多年的工作。

另请参阅this question 的回复。

【讨论】:

  • 你能推荐一个 good bignum 库吗? GMP绝对不是一个;它会在内存耗尽时无条件中止调用程序,这很容易通过外部输入触发,除非您添加大量检查...
  • 对我来说,GMP 已经足够好了。但我不是 bignum 专家,只是偶尔使用一个。例如,您可能会尝试使用 SBCL 在 Common Lisp 中编写应用程序。我相信它有不同的 bignums,并且可能会更好地处理内存耗尽,在我看来,这是一个堕胎的案例......而且维基百科列出了其他 bignum 库。
  • 我在这里看不到实际问题。 GMP 允许您将字符串转换为 bignums。如果您害怕巨大的 bignums,只需限制允许的字符串大小。此外,GMP 是免费的开源软件,因此请随时根据需要对其进行改进。不要忘记发布你的补丁!
  • 举个例子,对于一个想要用 bignums 存储和计算的通用数据库服务器来说,GMP 是完全没用的(严重的漏洞)。资源耗尽问题不能报错;它只会崩溃。即使你禁止 input 非常大的数字,你也必须检查计算中的事情不会爆炸,如果你支持非平凡的表达式,这很难(阅读:不可能)。
  • 再一次,解决方案是随心所欲地改进 GMP。它是免费软件。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 2021-03-09
  • 2010-09-26
  • 2020-01-04
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多