这是我的素数代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class prime_gen
{
public static void gen_prime(long min,long max)
{
long n=max/2,i=0,j=0;
boolean[] prime = new boolean[(int) max];
if(min==1)
{
System.out.println("2");
System.out.println("3");
}
else
if(min==3)
System.out.println("3");
else
if(min==2)
{
System.out.println("2");
System.out.println("3");
}
for (i = 1; i < n; i++)
for (j = i; j <= (n - i) / (2 * i + 1); j++)
prime[(int) (i + j + 2 * i * j)] = true;
for (i = 2; i < prime.length/2; i++)
{
if (!prime[(int)i])
{
if(2*i+1>min)
System.out.println((2*i+1)+" ");
}
}
}
public static void main(String args[])
{
try
{
int i=0,T=0;
long[] min,max;
String[] s1=new String[2];
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
T=Integer.parseInt(s);
min=new long[T];
max=new long[T];
for(i=0;i<T;i++)
{
s1=br.readLine().split(" ");
min[i]=Integer.parseInt(s1[0]);
max[i]=Integer.parseInt(s1[1]);
}
for(i=0;i<T;i++)
{
gen_prime(min[i],max[i]);
System.out.println();
}
}catch(Exception e)
{
return;
} }
}
约束是:
T<=10
max<=1000000000
max-min<=100000
我使用sundaram的筛子进行素数生成,代码适用于我的测试用例。我也使用了try catch块来处理异常。我不知道这段代码有什么问题.spoj论坛说只要JVM生成异常,就会抛出NZEC错误。
答案 0 :(得分:0)
以上代码适用于较小的输入,但您检查了corner or extreme cases
您处理的问题吗?当您使用extreme cases
进行检查时,您会发现代码正在提供runtime error
对于他们......在ideone上你会得到运行时错误..现在问题是什么?想想我们有输入的单个测试用例
999900000 1000000000
现在根据你的代码
n = max / 2 = 1000000000 / 2 = 500000000
现在直接转到for loop
for (i = 1; i < n; i++)
for (j = i; j <= (n - i) / (2 * i + 1); j++)
prime[(int) (i + j + 2 * i * j)] = true;
考虑外部循环的最后一个值(总是想到极值)
i = 500000000 (although `i` will be 1 less than this value ,I am considering it for simplicity as it will have not considerable effect and make our calculations easier)
j = i
现在您正在为prime
数组处理的索引现在是j
的第一个值
prime[(int) (i + j + 2 * i * j)] = 500000000 + some positive number
任何编程语言中数组的大小都不是那么大(我不了解JAVA)..关于10^6
maximum
(在JAVA中可以更多)..所以您正在访问无法管理的索引..这就是您获得runtime error
的原因..您必须改变您的方法..
现在我要指出的另一件事是Sieve of Sundaram
的复杂性
O(n * log n)
虽然Sieve of Eratosthenes
有复杂性
O(n * log(log n))
所以我认为您应该使用Sieve of Eratosthenes
,因为Sieve of Sundaram
可能会导致TLE
..但Sieve of Eratosthenes
不仅仅是足够的......你必须使用segmented sieve
来解决这个问题......你可能还有另外一种方法可以解决这个问题。
编辑1 : - 不会超出您的使用
boolean[] prime = new boolean[(int) max];
在上面一行只有在您输入我提到的测试用例后,您将获得runtime error
,因为coding websites
编辑2 : - 我运行了一个简单的代码,用于查找是否可以为阵列提供那么多内存,但我不这么认为......代码是
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
long max = 1000000000;
boolean[] prime = new boolean[(int) max];
System.out.println("IT WORKED");
}
}
这就是我得到的
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Ideone.main(Main.java:13)
和链接to the code .. 10 ^ 9
数组