我一直在研究这个问题已经有一段时间了,我无法弄清楚为什么我会一直遇到溢出错误。
代码可以正常工作,然后对较大的值不起作用。我测试了它,发现它的断点是输入225287(最后一个非中断值为225286,输出为2147431335)。
我怎样才能让这个工作达到2,000,000?
class SumOfPrimes{
static void Main(string[] args)
{
Primes primes = new Primes(2000000);
Console.WriteLine(primes.list_of_primes.Sum());
Console.ReadLine();
}
}
class Primes
{
public HashSet<int> all_numbers = new HashSet<int>();
public HashSet<int> list_of_primes = new HashSet<int>();
public HashSet<int> list_of_nonprimes = new HashSet<int>();
public Primes(int n)
{
all_numbers = new HashSet<int>(Enumerable.Range(1, n));
for (int i = 2; i < Math.Sqrt(n) + 1; i++)
{
for (int j = 3; j <= n / i; j++)
list_of_nonprimes.Add(i * j);
}
list_of_primes = new HashSet<int>(all_numbers.Except(list_of_nonprimes));
}
}
答案 0 :(得分:2)
你拥有的值不适合int的大小的内存,所以尝试使用biginteger 在这里的网站上。
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
答案 1 :(得分:1)
发生的是整数溢出。在32位系统上,int
只能保存最多2 ^ 31-1(2147483647)的正值。您可以尝试使用64位整数(我认为C#有它们),或者找到一个任意大小的整数库(@Calpis有助于链接到内置的整数库)。