【问题标题】:A value larger than ULong? Computing 100!大于 ULong 的值?计算100!
【发布时间】:2009-08-12 17:33:24
【问题描述】:

我正在尝试计算 100!并且似乎没有内置的阶乘函数。所以,我写了:

Protected Sub ComputeFactorial(ByVal n As ULong)
        Dim factorial As ULong = 1
        Dim i As Integer
        For i = 1 To n
            factorial = factorial * i
        Next
        lblAnswer.Text = factorial
    End Sub

不幸的是,在

值太大或太大 对于 UInt64 来说很小。

那么,有没有更大的数据类型来保存数字?我的方法有误吗?我很无助吗?

【问题讨论】:

  • 你为什么不抓住机会自己写一个 bigint 类呢?这更符合欧拉计划的精神...... :)
  • 备案:100! ~= 9.33262154 × 10^157
  • @Guffa 如果我只知道从哪里开始,哈哈
  • 实际上实现 bigint 类并不难。如果你只需要 100,你甚至可以通过重复加法来实现乘法!

标签: c# asp.net vb.net math


【解决方案1】:

听起来像是欧拉计划。

.NET 4.0 具有 System.Numerics.BigInteger,或者您可以在这里选择一个非常棒的实现:
C# BigInteger Class

编辑:树 :(

我会添加 - CodeProject 的版本具有其他功能,例如整数平方根、素性测试、卢卡斯序列生成。此外,您无法直接访问 .NET 实现中的缓冲区,这对我正在尝试的几件事来说很烦人。

【讨论】:

  • 确实,欧拉计划!我想我将不得不参加其他课程之一。很不幸!
  • 别难过——当我在 7 天内解决了大约 80 个问题时,我正在使用 CodeProject 中的那个。不久之后我就停下来了-愚蠢的ADD。 :o
【解决方案2】:

在您可以使用 System.Numerics.BigInteger 之前,您将无法使用像 BigInteger on Code Project 这样的非 Microsoft 实现。

【讨论】:

    【解决方案3】:

    提示:使用数组存储数字的位数。您可以通过检查得知结果不会超过 200 位。

    【讨论】:

      【解决方案4】:

      您需要一个“BigNums”的实现。这些是动态分配内存的整数,因此它们可以保持其值。

      一个版本实际上是cut from the BCL

      J# 库有一个 java.math.BigInteger 的实现,您可以在任何语言中使用它。

      或者,如果精度/准确度不是问题(您只关心数量级),您可以只使用 64 位浮点数。

      【讨论】:

        【解决方案5】:

        十进制将处理 0 到 +/-79,228,162,514,264,337,593,543,950,335,不带小数点(零刻度)

        【讨论】:

        • 值对于小数来说太大或太小。
        猜你喜欢
        • 2018-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多