0

我一直在研究这个问题一段时间,但我无法弄清楚为什么我不断收到溢出错误。

该代码在一定程度上可以正常工作,然后不适用于较大的值。我已经对其进行了测试,发现断点是输入 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));
    }
 }
4

2 回答 2

2

您拥有的值不适合 int 大小的内存,因此请尝试使用此处网站上使用的 biginteger。

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

于 2013-04-17T22:02:19.453 回答
1

发生的是整数溢出。在 32 位系统上,int最多只能保存 2^31-1 (2147483647) 的正值。您可以尝试使用 64 位整数(我认为 C# 有它们),或者找到一个任意大小的整数库(@Calpis 有助于链接到内置的)。

于 2013-04-17T22:06:18.987 回答