Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spoj-NZEC误差_Java_Primes - Fatal编程技术网

Java Spoj-NZEC误差

Java Spoj-NZEC误差,java,primes,Java,Primes,这是我的黄金一代代码: 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)

这是我的黄金一代代码:

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;

}   }

}
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
公共类素数
{
公共静态无效gen_prime(最小长、最大长)
{
长n=max/2,i=0,j=0;
布尔[]素数=新布尔[(int)max];
如果(最小==1)
{
系统输出打印项次(“2”);
系统输出打印项次(“3”);
}
其他的
如果(最小==3)
系统输出打印项次(“3”);
其他的
如果(最小==2)
{
系统输出打印项次(“2”);
系统输出打印项次(“3”);
}
对于(i=1;i对于(i=0;i上述代码适用于较小的输入,但您是否检查过您所处理的
极端情况或极端情况
?当您使用
极端情况
进行检查时,您会发现您的代码为它们提供了
运行时错误
。尝试一下,您会得到运行时错误。现在有什么问题吗?请思考一个我们有输入的单个测试用例

9999000000 100000000

现在根据你的密码

n = max / 2 = 1000000000 / 2 = 500000000
现在直接转到循环的
for

for (i = 1; i < n; i++)
        for (j = i; j <= (n - i) / (2 * i + 1); j++)
            prime[(int) (i + j + 2 * i * j)] = true;
现在为
prime
数组处理的索引现在是
j

prime[(int) (i + j + 2 * i * j)] = 500000000 + some positive number
在任何编程语言中,数组的大小都不是那么大(我不知道JAVA)…它的最大值是
10^6
maximum
(在JAVA中可以更大)…因此您正在访问无法管理的索引..这就是为什么会出现
运行时错误
。您必须改变方法

现在我要指出的另一件事是Sundaram的
筛子的复杂性

O(n*logn)

而Eratosthenes
的筛分则具有复杂性

O(n*log(log n))

因此,我认为你应该使用埃拉托什尼筛,因为圣代拉姆筛可能会导致TLE。但是埃拉托什尼筛不仅足够。你必须使用分段筛来解决这个问题。可能还有另一种方法可以解决这个问题我有这个问题

编辑1:-不要超出您使用的范围

boolean[] prime = new boolean[(int) max];
在上面的一行中,仅当您输入我提到的测试用例时,您将得到
运行时错误
,因为在
编码网站上不允许创建如此大的数组

编辑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)
和链接..数组大小
10^9
失败

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)