将字符串转换为大整数?

时间:2012-03-22 02:06:06

标签: java

我有一个任务(我认为是一个很常见的任务),其目标是开发一个可以用非常大的整数进行计算的LargeInteger类。

我显然不允许使用Java.math.bigeinteger课程。

从顶部开始,我被困住了。我需要从用户那里获取2个字符串(长数字),然后我将使用这些字符串来执行各种计算方法(添加,除法,乘法等)。

任何人都可以向我解释这应该如何运作的理论吗?从用户那里取出字符串后(因为它太大而不能存储在int中)我应该把它分解成10位数的长数字块(我认为10是最长可能是9?)

任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

首先,想想存储数字的方便数据结构是什么。考虑如何将N位数存储到int[]数组中。

现在让我们再加上一个例子。你会如何添加两个N数字?

使用我们的小学 - 学校,首先我们查看两个数字的最低有效数字(标准符号,这将是最右边的数字)。然后加起来。

因此,如果最右边的数字是78,我们会获得15。取这个结果的最右边的数字(5),这是答案中最不重要的数字。 1将继续进行下一次计算。所以现在我们看看第二个最低有效数字,并将它们与进位一起添加(如果没有进位,则为0)。并重复,直到没有数字要添加。

基本思想是在数字存储在某些数据结构中时,将手工添加,乘法等方式转换为代码。

答案 1 :(得分:1)

我会给你一些关于我可能会对类似任务做些什么的指示,但是让你弄清楚细节。

  1. 看看如何通过简单的电子加法器电路完成加法。具体而言,他们使用组合在一起的小块添加。这些原则将有所帮助。具体来说,您可以添加块,只需记住从一个块继续到下一个块。
  2. 您将其分解为较小的博客的想法非常好。只需记住正确的转换。我怀疑9位数字是正确的,为了携带,等等。
  3. 这些任务将帮助您进行加法和减法。乘法和除法有点棘手,但同样有一些提示。

    1. 乘法是更容易完成的任务,只需记住将一个数字的每个块与另一个相乘,并带有零。
    2. 整数除法基本上可以像长除法一样,一次只使用整个块。
    3. 我从来没有真正建立过这样的课程,所以希望你可以在这里使用。

答案 2 :(得分:0)

请查看Michael Bromberger(C库)的MPI 1.8.6源代码。它使用简单的bignums数据结构和简单的算法。它是C,不是Java,而是直截了当。

它的除法表现不佳(导致非常大的bignums到tex的转换速度慢),但你可以按照代码进行操作。

有一个函数mpi_read_radix用于读取任意基数(最多36位,字母Z为35)的数字,带有可选的前导+/-符号,并产生一个bignum。

我最近为编程语言解释器选择了这个代码,因为虽然它不是那里表现最快的,也不是最完整的,但它非常难以理解。我已经能够将平方根自己重写为更快的版本,将影响端口的一些编码错误修复为64位数字,并添加一些我需要的缺失操作。此外,许可证与BSD兼容。