C#中的高精度整数数学?

时间:2009-04-24 22:15:55

标签: c# types

我需要计算一个非常大的数字,C#中没有内置的数据类型可以处理如此大的数字。

基本上我想解决这个问题:

项目Euler 16:

  

2 ^ 15 = 32768及其数字之和   是3 + 2 + 7 + 6 + 8 = 26。

     

数字的总和是多少?   2号^ 1000?

我已经编写了代码,但是,如前所述,对于c#数据类型,该数字太大了。该代码已经过小数测试和验证(例如2 ^ 15),并且运行良好。

using System;

namespace _16_2E1000
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong sum = 0;
            ulong i = 1 << 1000;
            string s = i.ToString();
            foreach (char c in s)
            {
                sum += (ulong) Convert.ToInt64(c.ToString());
            }
            Console.WriteLine(sum);
            Console.ReadLine();
        }
    }
}

6 个答案:

答案 0 :(得分:3)

首先回答您的确切问题,找一个BigIntBigNum类型

其次,根据我对Project Euler的了解,将会有一种很酷,很棘手的方法来做到这一点。

作为第一个猜测我会计算2 ^ 1的回答者 - &gt; 2 ^ n(无论你能开展什么工作)并寻找模式。还要查看序列中的模式

V(0) = 2^p

V(n) = floor(V(n - 1) / 10)  
D(n) = V(n) % 10

答案 1 :(得分:3)

您可以使用J#类中的BigInteger。 First question in this article告诉你如何。这是一个痛苦的b / c然后你必须提供J# redistributable当你推出。

答案 2 :(得分:3)

我希望这不是一个家庭作业问题,但要达到2 ^ 1000的答案,你必须把它分成更小的块,

尝试类似的事情,

2 ^ 1000 = 2 * 2 ^ 999 = 2 ^ 999 + 2 ^ 999 = 2 ^ 998 + 2 ^ 998 + 2 ^ 998 + 2 ^ 998

分解成较小的位直到你可以解决问题,

项目的完整解决方案Euler在以下链接上。

http://blog.functionalfun.net/2008/07/project-euler-problem-16-calculating.html http://code.msdn.microsoft.com/projecteuler

答案 3 :(得分:3)

为解决此问题,没有必要具备Big Integer功能

可以使用

的属性
2^n = 2^(n-1) + 2^(n-1)

如果其他任务真的需要Big Integer,我在C#程序中使用了F#中的BigInt类,我很满意。

必要步骤

  1. 安装F# CTP

  2. 在您的C#(或其他.NET语言)应用程序中添加对FSharp.Core dll的引用。

  3. 添加:u sing Microsoft.FSharp.Math;

  4. 在“课堂视图”窗口中,您应熟悉两个班级的成员:BigIntBigNum

  5. 执行这些步骤后,基本上就可以使用BigInt类了。

    最后一个提示

    为了避免使用不正确的名称声明变量来保存使代码不可读的常量,我使用的名称以_(下划线)开头,后跟整数常量。通过这种方式,人们将拥有如下表达式:

    N = _2 * N;
    

    显然比以下更具可读性:

    N = Two * N;
    

答案 4 :(得分:0)

这是一个可以使用的BigInteger(源代码可用);但是,正如已经提到的,除了蛮力外,还有更有效的方法。

BigInteger on codeplex

答案 5 :(得分:0)

实际上,虽然大型实用工具可能会引起人们的兴趣,但即使是这样,你也不需要它。是的,看起来确实如此,但事实并非如此。事实上,使用大整数形式甚至可能会减慢速度。

由于我不想为您解决问题,我建议您以模块化的方式考虑这个问题。