spoj.com超过了发电机的时间限制

时间:2015-07-07 14:57:40

标签: c

提交答案时超出时间限制。我还面临同样的问题,我在spoj.com上提交了2-3个问题。

http://www.spoj.com/problems/PRIME1/

  

彼得想为他的密码系统生成一些素数。帮助他!你的任务是生成两个给定数字之间的所有素数!

     

输入

     

输入以单行中的测试用例的数量t开始(t <= 10)。在下一个t行的每一行中,有两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000)由空格分隔。

     

输出

     

对于每个测试用例,打印所有质数p,使得m <= p <= n,每行一个数,由空行分隔的测试用例。

     

实施例

     

输入:

someFunction()
     

输出:

2
1 10
3 5
     

警告:大输入/输出数据,请注意某些语言(如果算法设计得很好,大多数应该没问题)

这是我在C中的代码。

2
3
5
7

3
5

1 个答案:

答案 0 :(得分:2)

您的算法是O((m-n)* n),当然不会在分配的时间限制内运行。让我们回顾一下你的代码:

count=0;
for(k=1;k<=j/2;k++)
{
if(j%k==0)
count++;
if(count>1)
break;
}
if(count==1)
printf("%lld\n",j);

微优化:为什么需要计数器?你可以侥幸逃脱。

优化:您为什么要测试素数j/2?如果j的除数大于1,则保证j的除数最多为sqrt(j)

微优化:除了2之外,根本不考虑偶数。

bool prime = j==2 || j%2==1 ;
for(k=2;prime && k*k<=j;k++)
{
if(j%k==0) prime = false;
}
}
if(prime) printf("%lld\n",j);

现在这是O((m-n)* sqrt(n)),速度要快得多。

我想这不会限制。您可以扩展第二个微优化以跳过可被3整除的数字。

优化:如果这仍然不够,那么你必须进行伪素性测试。在O(log(n))中很容易实现的一个测试是https://en.wikipedia.org/wiki/Fermat_primality_test。有了这个,复杂性降到O((m-n)* log(n)),应该在可用的时间限制内运行。