下面的代码适用于所述数字(6008514751),但对于所需的最大值:600851475143抛出错误。我使用long类型代替了'int',所以我不明白为什么我的程序不能运行600851475143。非常感谢您的帮助。
引发的错误是:
未处理的异常:
System.OverflowException:算术运算导致溢出。
在<0273ea83c32446be9aa2f9fc5d30dab0>:0
中的HelloWorld.MakeSieve(System.Int64 max)[0x00000]中
在<0273ea83c32446be9aa2f9fc5d30dab0>:0
中的HelloWorld.Main()[0x00000]中
[错误]致命异常:System.OverflowException:算术运算导致溢出。
在<0273ea83c32446be9aa2f9fc5d30dab0>:0
中的HelloWorld.MakeSieve(System.Int64 max)[0x00000]中
在<0273ea83c32446be9aa2f9fc5d30dab0>:0
*更新1:有人建议我看看“我在C#中需要很大的数组长度(大小)”。我尝试用double类型替换列表(甚至尝试将所有“ long”替换为“ double”),但无济于事。
更新2:结尾的L(最大值= 600851475143L)没有太大帮助。
谢谢!
using System;
using System.Collections.Generic;
class HelloWorld
{
public static long Max = 600851475;
public static List<long> AllPrimesBelowMax = new List<long>();
public static long maxPrime = 0;
static void Main()
{
MakeSieve(Max);
}
private static bool[] MakeSieve(long max)
{
bool[] isPrime = new bool[max + 1];
for (long i = 2; i <= max; i++)
{
isPrime[i] = true;
}
//cross out multiples
for (long i = 2; i <= max; i++)
{
//check if i is prime
if (isPrime[i] == true)
{
//cross out multiples of i
for (long j = i * 2; j <= max; j += i)
{
isPrime[j] = false;
}
}
}
for (long i = 2; i <= max; i++)
{
if (isPrime[i] == true)
{
AllPrimesBelowMax.Add(i);
}
}
Console.WriteLine(AllPrimesBelowMax[AllPrimesBelowMax.Count - 1]);
return isPrime;
}
}