【发布时间】:2010-11-06 00:59:03
【问题描述】:
我还是个学生,我觉得 Euler 项目很有趣。
有时问题需要比原始类型更大的计算。我知道你可以实现它,但我懒得这样做,
所以我尝试了几个库,
MAPM :: 性能非常好,但它只提供大浮点数,可以检查它是否为整数。接受输入非常好,但提供输出却很讨厌,并且使用 Visual C++ 2008 express 编译起来就像魔术一样。
bigint :: 很小,但需要对许多部分进行重新设计。使用非常简单,但功率非常有限,与其他相比非常慢。只有大整数。
ttmath :: 迄今为止我尝试过的最漂亮的一个!只需包含一些文件,您就拥有令人难以置信的力量/简单性。像 Visual C++ 2008 express 中的魔术一样编译。它很快,因为它提供了固定长度的数字。它是使用 C++ 中的元编程构建的。我看到的唯一缺点是,数字在运行时的长度不是任意的,但是在编写代码时你可以很容易地拥有 1024K 的数字,
ttmath::UInt<1024 * 1024> reallyHugeUnsignedInteger;
它提供了三种类型:有符号、无符号和浮点数。
我尝试在VC2008 express下编译gmp,但是失败了!我知道它是最好的,但对于初学者来说在 VC2008 express 下编译并不容易,如果你指出一个在 VC 下编译 gmp 的教程,我也很感激。
编辑 :: 如果您知道如何使用 VC 2008 编译 gmp,请向我解释并获得赏金 :)
EITD :: 看来我没有使用正确的术语,所以这里是用于 Windows 的神奇 GMP!适用于 VC 2008 :) MPIR
【问题讨论】:
-
注意:你可能需要一个 bignum 库来解决一些问题,但大多数欧拉问题并不真正需要它。当您需要找到某个非常大的属性时,通常要真正计算它以找到该属性是非常低效的。通常您需要分析问题并找到更好的解决方案。例如,如果您需要找出 1000! 中零的个数,计算 1000! 的实际值!将是一个非常低效的解决方案。
-
好点,但我并不总是得到最佳解决方案:)
-
@Igor:如果低效的解决方案在一秒钟内运行并且需要几分钟的时间来编写,我对高效的解决方案不感兴趣。是的,我已经做了一些欧拉问题,是的,有些情况下,在问题上抛出 GMP 可以立即解决问题。 1000!小于 10 000 个二进制数字,在 PC 上计算可能相当简单。它肯定比计算 1000 中尾随零的数量要快!手工(虽然,当然,这也不是那么棘手)。
-
好点伊戈尔和史蒂夫!您的 cmets 相得益彰。