2012-03-22 192 views
0

我有一个任务(我认为一个很常见的),其目标是开发一个LargeInteger类,它可以用..非常大的整数进行计算。将字符串转换为大整数?

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

右上角我卡住了。我需要从用户(长数字)采取2个字符串,然后我将使用这些字符串来执行各种计算方法(添加,除法,乘法等)。

任何人都可以向我解释背后的理论这应该工作?在我从用户处取得字符串后(因为它太大而无法存储在int中),我应该把它分解成10位数的长数字块(我认为10是最长也许是9?)

任何帮助表示赞赏。

+1

整数数组(int []')在这里似乎是合理的数据结构。 – 2012-03-22 02:09:52

回答

3

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

现在我们来举个例子。你将如何去添加两个N数字号码?

使用我们的小学增加,首先我们看最低有效数字(以标准表示法,这将是最右边的数字)的两个数字。然后添加它们。

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

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

+0

好吧,我喜欢这个答案..这绝对让我更好地思考如何做到这一点。所以基本上......只是想到这里...它可能涉及2个int []数组,其中每个数字占据数组中的一个位置。然后我会一起循环访问数组,并从最右边的数字开始添加每个数字。如果结果是> 9,我会存储超过9的数量,并将其用于下一个添加的后续2个整数。这是否全部正确? “N”数字代表什么意思? – Sackling 2012-03-22 02:37:28

+0

@Sackling:确实! :)哦,我刚刚提到过,因为数字的大小是任意的,并且无论数字中有多少个数字,您选择的算法都应该可以工作。例如1000是一个3位数字。 – tskuzzy 2012-03-22 05:37:32

1

我会给你几个关于我可能用类似任务做什么的指示,但让你弄清楚细节。

  1. 看看如何增加从简单的电子加法器电路。具体来说,他们使用小块加法组合在一起。这些校长将会提供帮助。具体而言,您可以添加块,只需记住从一个块到下一个块。
  2. 你把它分解成更小的博客是一个很好的想法。只需记住正确的转换。我怀疑9位数字就是正确的,以便携带,等等。

这些任务将帮助您加法和减法。乘法和除法有点棘手,但同样,一些技巧。

  1. 乘法是更容易的任务,只要记住将一个数字的每个块乘以另一个数字,并携带零。
  2. 整数除法基本上可以像长分区一样使用,一次只能使用整个区块。

我从来没有真正建立过这样的课程,所以希望在这里有一些东西可以使用。

0

查看Michael Bromberger(一个C库)的MPI 1.8.6的源代码。它使用简单的数据结构来生成简单的算法。这是C,而不是Java,但很简单。

其分部表现不佳(并导致非常大的bignum转换为tex的速度缓慢),但您可以按照代码进行操作。

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

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