我有一个任务(我认为是一个很常见的任务),其目标是开发一个可以用非常大的整数进行计算的LargeInteger类。
我显然不允许使用Java.math.bigeinteger
课程。
从顶部开始,我被困住了。我需要从用户那里获取2个字符串(长数字),然后我将使用这些字符串来执行各种计算方法(添加,除法,乘法等)。
任何人都可以向我解释这应该如何运作的理论吗?从用户那里取出字符串后(因为它太大而不能存储在int中)我应该把它分解成10位数的长数字块(我认为10是最长可能是9?)
任何帮助表示赞赏。
答案 0 :(得分:3)
首先,想想存储数字的方便数据结构是什么。考虑如何将N
位数存储到int[]
数组中。
现在让我们再加上一个例子。你会如何添加两个N
数字?
使用我们的小学 - 学校,首先我们查看两个数字的最低有效数字(标准符号,这将是最右边的数字)。然后加起来。
因此,如果最右边的数字是7
和8
,我们会获得15
。取这个结果的最右边的数字(5
),这是答案中最不重要的数字。 1
将继续进行下一次计算。所以现在我们看看第二个最低有效数字,并将它们与进位一起添加(如果没有进位,则为0
)。并重复,直到没有数字要添加。
基本思想是在数字存储在某些数据结构中时,将手工添加,乘法等方式转换为代码。
答案 1 :(得分:1)
我会给你一些关于我可能会对类似任务做些什么的指示,但是让你弄清楚细节。
这些任务将帮助您进行加法和减法。乘法和除法有点棘手,但同样有一些提示。
我从来没有真正建立过这样的课程,所以希望你可以在这里使用。
答案 2 :(得分:0)
请查看Michael Bromberger(C库)的MPI 1.8.6源代码。它使用简单的bignums数据结构和简单的算法。它是C,不是Java,而是直截了当。
它的除法表现不佳(导致非常大的bignums到tex的转换速度慢),但你可以按照代码进行操作。
有一个函数mpi_read_radix
用于读取任意基数(最多36位,字母Z为35)的数字,带有可选的前导+/-符号,并产生一个bignum。
我最近为编程语言解释器选择了这个代码,因为虽然它不是那里表现最快的,也不是最完整的,但它非常难以理解。我已经能够将平方根自己重写为更快的版本,将影响端口的一些编码错误修复为64位数字,并添加一些我需要的缺失操作。此外,许可证与BSD兼容。