生成高达Long.MaxValue,C#的质数序列

时间:2019-05-29 08:11:36

标签: c# primes sieve-of-eratosthenes

使用大小为long型的boolenas数组在C#上实现erathesthenes的筛网会产生溢出异常,请确保这是因为c#中的数组类型被限制为最大32位整数的大小。据我了解,这是因为通常用户无法在RAM中存储大于32位整数大小的数组。但是我们有布尔类型,它只是2位信息,因此该数组所需的ram应该是$ 2 * Long.MaxValue $。所以问题如下:

1)如何生成最长为Long.MaxValue的质数序列?

2)哪种数据类型最好用于存储此类序列?

3)我们可以重新定义大于32位最大大小的数组类型吗?

我的尝试在这里:

public bool[] MakeSieve(long max)
    {
        // Make an array indicating whether numbers are prime.
        bool[] is_prime = new bool[max + 1];
        for (int i = 2; i <= max; i++) is_prime[i] = true;

        // Cross out multiples.
        for (int i = 2; i <= max; i++)
        {
            // See if i is prime.
            if (is_prime[i])
            {
                // Knock out multiples of i.
                for (int j = i * 2; j <= max; j += i)
                    is_prime[j] = false;
            }
        }
        return is_prime;
    }

当然,它会引发溢出异常。

0 个答案:

没有答案