Вопрос

Я одновременно учусь использовать JPDA на Netbeans и решаю Первичный Генератор проблема онлайн-судьи Сферы.

Я тут читал этот учебник по netbeans.org о he JPDA, но не нашел, что это сильно помогло.

Этот код, основанный на реализации Site of Eratostenes, предоставленной starblue здесь, работает вот так:

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

Но я не уверен, смогу ли я таким образом получить значимую информацию.Это те экраны, которые я получаю:

альтернативный текст http://img525.imageshack.us/img525/6238/breakpoints.jpg

альтернативный текст http://img98.imageshack.us/img98/5262/watchesz.jpg

Я не знаю, как извлечь из этого полезную информацию.

Мои вопросы таковы:

a) Я хочу наблюдать за набором битов простых чисел, когда он проходит через этот цикл.

Как мне это сделать?

б) Что именно не так с этим кодом? Как вы определили это с помощью отладчика?

Пожалуйста, упомяните пошаговый процесс.

Это было полезно?

Решение

Итак, я извлек следующий метод:

    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() чтобы убедиться, что им звонят.(Кстати, соглашение Java, в отличие от C #, предусматривает, что имена методов должны начинаться со строчной буквы.)

Все это было сделано без утруждения пониманием кода.:) Однако после первого прогона стало довольно ясно, что проблема заключается в том, что BitSet произведенный SieveOfEratosthenes() всегда пуст (или, скорее, всегда полностью false).Я не использовал отладчик NetBeans, но я подозреваю, что вкладка "Локальные переменные" - ваш друг здесь.

Я не собираюсь делать за тебя домашнюю работу.:) Но идея Сита Эратосфена состоит в том, чтобы пропустить простые числа и исключить только не простые.Изучите свой SieveOfEratosthenes() метод и спросите себя:когда он пропустит какое-то число?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top