【发布时间】:2015-02-25 09:55:53
【问题描述】:
我知道关于同一个主题的 SO 已经有很多问题,但这个问题可能会有所不同。我研究了一些用于计算从 2 到 N 的素数的算法。我编写了以下算法来计算某个范围内的素数,例如从 N 到 M 其中 M 可以与 10^10 一样大,并且 N 和M 可以是10^6。
for (k = 0; k < t; k++)
{
int[] indexOfPrimes = new int[m[k] - n[k] + 1];
int index_1=2;
int index_2=0;
int counter = 0;
for (index_1 = 2; index_1 < Math.Sqrt(m[k]); index_1++)
{
counter = 0;
for (index_2 = index_1*index_1; index_2 <= m[k];)
{
if (index_2 >= n[k] && index_2 <= m[k])
indexOfPrimes[index_2 % (m[k] - n[k] + 1)] = 1;
index_2 = (index_1 * index_1) + (index_1 * ++counter);
}
}
for (i = n[k]; i <= m[k]; i++)
{
if (i == 1)
continue;
if (indexOfPrimes[i % (m[k] - n[k] + 1)] != 1)
Console.WriteLine(i);
}
Console.WriteLine("\n");
}
这里带有变量k 的循环用于处理t 测试用例。当 m[k]>10^7 时,该算法需要大量时间来处理最大范围(即 100000)。
有没有办法不从2开始计算,而是直接从指定范围内计算?
有没有办法让我更快?
编辑:有人可以提供一个足够大的随机输入来测试我的算法。它总是给出Time Limit Exceeded,但是,它在我的笔记本电脑上运行只需 2.5 秒。
编辑:我在最大输入时将其减少到 1.5 秒。给我错误的答案。不明白为什么。
【问题讨论】:
-
这是 SPOJ 的问题吗?从描述来看是这样的。
-
是的,我收到了
Time Limit Exceeded。 -
您的笔记本电脑可能比 SPOJ 电脑快 6 倍。
标签: performance algorithm c#-4.0 primes sieve-of-eratosthenes