我需要计算一个非常大的数字,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();
}
}
}
答案 0 :(得分:3)
首先回答您的确切问题,找一个BigInt
或BigNum
类型
其次,根据我对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类,我很满意。
必要步骤:
安装F# CTP
在您的C#(或其他.NET语言)应用程序中添加对FSharp.Core
dll的引用。
添加:u sing Microsoft.FSharp.Math;
在“课堂视图”窗口中,您应熟悉两个班级的成员:BigInt
和BigNum
执行这些步骤后,基本上就可以使用BigInt
类了。
最后一个提示:
为了避免使用不正确的名称声明变量来保存使代码不可读的常量,我使用的名称以_
(下划线)开头,后跟整数常量。通过这种方式,人们将拥有如下表达式:
N = _2 * N;
显然比以下更具可读性:
N = Two * N;
答案 4 :(得分:0)
这是一个可以使用的BigInteger(源代码可用);但是,正如已经提到的,除了蛮力外,还有更有效的方法。
答案 5 :(得分:0)
实际上,虽然大型实用工具可能会引起人们的兴趣,但即使是这样,你也不需要它。是的,看起来确实如此,但事实并非如此。事实上,使用大整数形式甚至可能会减慢速度。
由于我不想为您解决问题,我建议您以模块化的方式考虑这个问题。