超出spoj.com主发电机时间限制
提交答案时超出了时间限制。我在spoj.com上提交了2-3个问题,我也面临同样的问题 彼得想为他的密码系统生成一些素数。救救他!您的任务是生成两个给定数字之间的所有素数 输入 输入以单行中测试用例的数量t开始(t您的算法是O((m-n)*n),当然不会在分配的时间限制内运行。让我们看一下您的代码:超出spoj.com主发电机时间限制,c,C,提交答案时超出了时间限制。我在spoj.com上提交了2-3个问题,我也面临同样的问题 彼得想为他的密码系统生成一些素数。救救他!您的任务是生成两个给定数字之间的所有素数 输入 输入以单行中测试用例的数量t开始(t您的算法是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(
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);
现在这是O((m-n)*sqrt(n)),它要快得多
我想这不会造成限制。你可以扩展第二个微优化,很容易跳过可被3整除的数字
优化:如果这还不够,那么你必须做一个伪素性测试。一个很容易在O(log(n))中实现的测试是。通过这个测试,复杂性下降到O((m-n)*log(n))应该在可用的时间限制内运行。您是否考虑过使用Eratosthenes筛并将其与二进制搜索相结合?或者硬编码素数?暴力是行不通的。您可能希望谷歌搜索Eratosthenes筛。为了可读性/可理解性,请一致地缩进代码。建议在每次操作后使用4个空格使用大括号“{”并在每个右大括号“}”之前取消缩进。
2
3
5
7
3
5
#include <stdio.h>
int main()
{
int t,i,k,count;
long long int j=0,m=0,n=0;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%lld%lld",&m,&n);
for(j=m;j<=n;j++)
{
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);
}
printf("\n");
}
return 0;
}
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);
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);