提交答案时超出时间限制。我还面临同样的问题,我在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
答案 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)),应该在可用的时间限制内运行。