繁体   English   中英

如何编写解决方案以处理大量数字?

[英]How to Code a Solution To Deal With Large Numbers?

我正在做一些欧拉计画的问题,并且在大多数时候,计算涉及除int,float,double之外的大量数字。

首先,我知道我应该寻找更有效的计算方法,以避免出现大量问题。 我听说过Bignum库。

但是,出于学者的利益,我想知道如何编写自己的解决方案。

有专家可以帮我吗? (我的语言是C)

您需要将大数字存储在计算机可以用其本机类型轻松处理的基数中,然后将数字存储在可变长度数组中。 我建议您为简单起见,首先将数字存储在以10为基数的表格中,以了解如何执行此操作。 这将使调试变得容易得多。

一旦有了可以以这种形式存储数字的类,就可以在该类上实现加,减,乘等运算。 每个操作都必须遍历其操作数的位数并进行组合,请小心正确地进行携带,以使您的位数永远不会大于基数。 加减法很简单。 乘法需要更多的工作,因为朴素的算法需要嵌套循环。 然后,一旦完成工作,就可以尝试以有效方式(例如重复平方)实现求幂。

如果您打算编写一个严肃的 bignum实现,那么以10为底的数字将不会减少它。 它浪费了内存,而且速度很慢。 您应该选择计算机的自然基准,例如256或字长(2 ** 32)。 但是,这会使简单的操作变得更加困难,因为如果天真地将两位数字相加,将会溢出,因此您需要非常小心地进行处理。

对于Euler项目来说,C不是一个好的选择 C的好处是原始速度,机器可移植性(在某种程度上,使用标准C),语言互操作性(如果某种语言与另一种语言进行通信,则C是流行的首选),紧贴特定库或平台的API(因为C很常见,例如OS API),以及稳定的语言和stdlib。 这些好处均不适用于解决Euler项目问题​​。 甚至没有原始速度,因为大多数问题都不是原始计算,而是了解所需的算法,您可以整日坐在那里等待提交之前。

如果您试图通过Project Euler问题来扩展C的使用经验,那完全没问题,只是要意识到这种经验并不一定适用于您可能会从事的长期且真实的C项目。

对于这种简短的一次性问题,那些通常被称为“脚本语言”的语言将更好,更快(在开发时间内)且更容易工作。 尝试使用Python,它在许多方面都接近C,包括C API,并且在各种流行的“脚本语言”中,您可能会发现与C项目结合使用最多的一种。

这可能会成为一个不受欢迎的答案,但这不是一个大问题-再加上我真的很喜欢C,并且经常使用C / C ++-并且这里有一个明确的答案可以解决您的问题:“不要使用C”,最后一个数字解决方案,取决于您选择的替代方案。 再次选择Python,整数没有上限(下面有注释),我用它自然地编码了Euler项目问题​​的答案,而在其他语言中,我必须使用比较痛苦的替代数字库。

Python整数: 2.x中有两种整数类型,“ int”和“ long”(在3.x中已完全统一)。它们之间的转换实际上是无缝的,而“ long”则允许任意大的值,而不是像C的long那样成为更大的'int'类型。)

用于C / C ++的流行的bignum库是GNU MP Bignum库 我已经将它用于几个Euler项目问题​​,但事实仍然是C对于Euler问题不是很合适的语言。 如果性能更重要,则C可以提供更多的性能,但是现在,使用内置于bignum支持的语言(例如Ruby)会更好得多。

一种简单的方法是将数字视为以b为基数的字符串表示形式。 假设b = 10,可以使用与笔和纸相加数字时所使用的相同方法来完成简单的算术运算,例如对两个这样的字符串进行加法。 其他简单操作也是如此。 为了获得更好的结果,您可以采用更大的基数。

像这样的简单bignum实现足以解决大多数Project Euler问题(可能是所有问题,但我在Euler并没有解决很多问题,所以不能确定),但是有一些方法可以使用更快的算法进行乘法和乘法运算。部门/国防部

尽管我建议您编写自己的bignum进行练习,但是,如果您确实遇到困难,可以从已经实现的bigint库的代码中汲取灵感。 对于严重的实现,诸如gmp之类的选择是显而易见的选择。 但是当在线解决类似的练习问题时,您也可以找到其他人编码的小bigints(例如Abednego的bigint.cpp )。

这是一个不错的C简单bignum模块。您可以从中学习想法。 C代码不是最高质量,但是该算法实现良好且相当普遍。

有关更高级的内容,请查找GMP。

如果您想要一个不错的C ++版本(我知道,您说的是C,但这确实是有趣的代码),请看一下CGAL的内部知识: http ://www.cgal.org/

我完全同意Roger Pate的观点。 我见过很多次人们遇到C / C ++ / Java的整数极限问题,但是对于Python,这不是问题。 对于大多数Project Euler问题,提出正确的算法至关重要,而从C语言获得的性能将无关紧要。 此外,有了Python中可用的关联数据类型,字典,集合等以及一些内置库itertools,仅此而已,解决Python问题的速度要快得多。 自从加入Euler项目之后,我就开始认真学习Python,并且对自己的决定感到满意(我的第一语言是C ++,第二语言是Perl,但是我想学习Python)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM