大数的素数之和

时间:2013-04-17 21:59:07

标签: c# primes

我一直在研究这个问题已经有一段时间了,我无法弄清楚为什么我会一直遇到溢出错误。

代码可以正常工作,然后对较大的值不起作用。我测试了它,发现它的断点是输入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));
    }
 }

2 个答案:

答案 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有助于链接到内置的整数库)。