문제

나는 Netbeans에서 JPDA를 사용하는 법을 배우고 프라임 생성자 Sphere의 온라인 판사 문제.

나는 읽고 있었다 NetBeans.org에 대한이 튜토리얼 그는 JPDA에 대해, 그러나 많은 도움을받지 못했습니다.

이 코드는 StarBlue에서 제공 한 Eratostenes 구현의 체를 기반으로합니다. 여기, 다음과 같이 실행 중입니다.

2
1 10
//here the primes between 1 and 10 should print 
3 5
//here the primes between 3 and 5 should print 




package sphere;

/**
 *
 * @author Administrator
 */
//import java.util.ArrayList;
import java.util.BitSet;
import java.lang.Math.*;
import java.util.ArrayList;

public class Main
{

  public static int ApproximateNthPrime(int nn)
{
    double n = (double)nn;
    double p;
    if (nn >= 7022)
    {
        p = n * Math.log(n) + n * (Math.log(Math.log(n)) - 0.9385);
    }
    else if (nn >= 6)
    {
        p = n * Math.log(n) + n * Math.log(Math.log(n));
    }
    else if (nn > 0)
    {
        p = new int[] { 2, 3, 5, 7, 11 }[nn - 1];
    }
    else
    {
        p = 0;
    }
    return (int)p;
}

// Find all primes up to and including the limit
public static BitSet SieveOfEratosthenes(int limit)
{
    final BitSet primes = new BitSet();
    primes.set(0,false); 
    primes.set(1,false); 
    primes.set(2,limit,true); 

    for (int i =0; i*i<limit;i++)
    {
        if (primes.get(i))
        {
            for (int j=i*1; j<limit;j+=1)
            {
                primes.clear(j);// hace que el indice j sea false (no primo)
            }

        }

    }
    return primes;
}

public static ArrayList<Integer> GeneratePrimesSieveOfEratosthenes(int n)
{
    int limit = ApproximateNthPrime(n);
    BitSet bits = SieveOfEratosthenes(limit);
    ArrayList <Integer> primes = new ArrayList<Integer>();
    for (int i = 0, found = 0; i < limit && found < n; i++)
    {
        if (bits.get(i))
        {
            primes.add(i);
            found++;
        }
    }
    return primes;
}





  public static void main (String[] args) throws java.lang.Exception
  {
     java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in));
     String s;

     s= r.readLine();

     int test_cases = Integer.parseInt(s);


     int case_counter =0;

     while (case_counter<test_cases) {

        // System.out.println(s);
         s = r.readLine();

         String [] splitted = s.split(" ");

         int lower_bound = Integer.parseInt(splitted[0]);
         int upper_bound = Integer.parseInt(splitted[1]);



        ArrayList <Integer> primesList=  GeneratePrimesSieveOfEratosthenes(upper_bound);



         for (int i =0; i<primesList.size();i++){
            if (primesList.get(i)<=lower_bound)System.out.println(primesList.get(i));
         }


         case_counter++;

         System.out.println(" "); // space that separates test cases

     }
  }
}

ArrayList Primeslist가 초기화되지 않았고이 코드를 의심하고 있습니다. 솔직히 말하면, 나는 그것을 잘 이해하지 못합니다.

if (primes.get(i))
        {
            for (int j=i*1; j<limit;j+=1)
            {
                primes.clear(j);
            }

        }

조건부가있는 조건부 중단 점을 사용하는 것은 다음과 같습니다.

primes.get(j)==false

그러나 나는 이런 식으로 의미있는 정보를 얻을 수 있는지 확실하지 않습니다. 이것들은 내가 얻는 화면입니다.

Alt Text http://img525.imageshack.us/img525/6238/breakpoints.jpg

Alt Text http://img98.imageshack.us/img98/5262/watchesz.jpg

나는 이것으로 유용한 정보를 얻는 방법을 모른다.

내 질문은 다음과 같습니다.

a)이 루프를 통과 할 때 Primes Bitset을보고 싶습니다.

어떻게해야하나요?

비) 이 코드에서 정확히 무엇이 잘못 되었습니까? 디버거를 사용하여 어떻게 발견 했습니까?

단계별 프로세스를 언급하십시오.

도움이 되었습니까?

해결책

그래서 다음 방법을 추출했습니다.

    private static void printPrimes(int lower_bound, int upper_bound) {
    ArrayList<Integer> primesList = GeneratePrimesSieveOfEratosthenes(upper_bound);

    for (int i = 0; i < primesList.size(); i++) {
        if (primesList.get(i) <= lower_bound)
            System.out.println(primesList.get(i));
    }
}

그리고 main() 콘솔과 디버거를 동시에 엉망으로 만들고 싶지 않았기 때문에 몇 가지 임의의 인수 (10 및 100)와 함께 호출하는 방법. 그런 다음 (Eclipse를 사용하고 있습니다)의 시작 및 끝 줄에 일반 중단 점을 넣습니다. ApproximateNthPrime(), SieveOfEratosthenes() 그리고 GeneratePrimesSieveOfEratosthenes() 그들이 부름을 받고 있는지 확인하기 위해. (그건 그렇고, C#과 달리 Java Convention은 메소드 이름이 소문자로 시작하는 것입니다.)

코드를 이해하지 못하는 모든 것. :) 그러나 첫 번째 런 스루 후에, 문제는 BitSet 생산 SieveOfEratosthenes() 항상 비어 있습니다 (또는 오히려 항상 전적으로 false). NetBeans Debugger를 사용하지는 않았지만 "로컬 변수"탭이 여기의 친구라고 생각합니다.

나는 당신을 위해 당신의 숙제를하지 않을 것입니다. :) 그러나 Eratosthenes의 체에 대한 아이디어는 소수를 건너 뛰고 비 프라임 만 제거하는 것입니다. 당신을 검사하십시오 SieveOfEratosthenes() 방법과 스스로에게 물어보십시오 : 언제 숫자를 건너겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top