SPOJ 上的主生成器 PRIME1
Prime Generator PRIME1 on SPOJ
Peter想为他的密码系统生成一些质数。帮帮他!你的任务是生成两个给定数字之间的所有质数! 输入
输入以单行中测试用例的数量 t 开头 (t<=10(。在接下来的每条t行中,有两个数字m和n(1 <= m <= n <= 1000000000,n-m<=100000(,用空格分隔。 输出
对于每个测试用例,打印所有素数 p,使 m <= p <= n,每行一个数字,测试用例用空行分隔。
任何人都可以帮助我优化我的代码,因为它显示即使在我使用 sieve 之后也超过了时间限制。这是问题的链接 https://www.spoj.com/problems/PRIME1/这是我的代码:
#include <iostream>
#include <math.h>
using namespace std;
int is_prime(int m)
{
int i,c=0;
for(i=2;i<=sqrt(m);i++)
{
if(m%i==0)
c++;
}
if(c==0)
return 1;
else
return 0;
}
int main()
{
int n,m,i,j,k,num;
cin>>num;
for(i=1;i<=num;i++)
{
cin>>m>>n;
int a[n];
for(j=0;j<=n;j++)
a[j]=1;
for(j=m;j<sqrt(n);j++)
{
if(is_prime(j)==1)
{
for(k=j*j;k<=n;k=k+j)
{
a[k]=0;
}
}
}
for(j=m;j<=n;j++)
{
if(a[j]==1)
cout<<j<<endl;
}
cout<<endl;
}
enter code here
return 0;
}
您的代码有几个问题:
-
在给定的时间限制下,您不能创建 10^9 (
int a[n]
( 数组! -
嵌套的for循环花费的时间太长几乎
O(sqrt(n-m)^2)
优化使用 https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes 和 https://www.geeksforgeeks.org/segmented-sieve/
相关文章:
- SPOJ 上的主生成器 PRIME1
- SPOJ中的运行时错误
- 代码在代码块上运行良好,但在 SPOJ 上无法运行
- 对于 spoj 的问题 TRT(对待奶牛)的 dp 的最佳方法是什么?
- 当我的代码工作正常时,为什么在SPOJ中遇到运行时(Sigabrt)错误
- TLE试图使用Dinic算法在SPOJ上求解Fastflow
- 如何提高主生成器 (SPOJ) 解决方案的效率
- 为什么我在SPOJ上为Buglife获得WA
- SPOJ 问题 ADDREV - 添加反转数字(考虑到我的代码,我得到了一个错误的答案,这很荒谬......
- BFS 方法中的 TLE for SPOJ AKBAR
- 在 spoj AP2 上弄错了
- 我在spoj-lastdig2中使用我的代码 - 重新访问的最后一位数字
- Spoj :ENIGMATH - PLAY WITH MATH
- SPOJ - Prime Path (PPATH)
- 最近一对SPOJ logN时间回答错误
- SPOJ FASTFLOW上的错误答案
- spoj http://www.spoj.com/problems/JULKA/
- 程序以计算2个数字之间的素数-SPOJ Quality2
- 为什么我得到这个代码的SIGABRT?( PRIME1 on SPOJ ).
- 我在spoj上的PRIME1中得到分割错误.我该如何根除它?