о решете Эратосфена

У меня проблемы с ситом эратосфена. Итак, у меня есть математические расчеты для сита из книги под названием «Контуры Шаума», но я думаю, что книга запрограммирована на неправильный код... Это код из книги:

public class Sieve
{
    final static int P = 800;
    static boolean[] isPrime = new boolean[count];

Sieve();
{
    for (int i = 2; i<P; i++)
    {
        isPrime[i] = true;
    }
    for (int i = 2; i<P/2; i++)
    {
        if (isPrime[i])
        {
            for (int j = 2*i; j<P; j += i)
            {
                isPrime[j] = false;
            }
        }   
    }
}
public static void main(String[] args)
{
    new Sieve();
    print();
}

static void print()  {
    for (int i=0; i<count; i++)
        if (isPrime[i]) System.out.println(i + " ");
        else if (i%90==0) System.out.println();
        System.out.println();
}}

Так что да, я использовал код и внес небольшие изменения из-за того, что "Sieve()" не распознается. Вот мой код:

public class Primenumbers
{
    final static int count = 1000;
    static boolean[] isPrime = new boolean[count];

    public static sieve(int count, boolean isPrime);
    {
        for (int i = 2; i<count; i++)
        {
            isPrime[i] = true;
        }
        for (int i = 2; i<count/2; i++)
        {
            if (isPrime[i])
            {
                for (int j = 2*i; j<count; j += i)
                {
                    isPrime[j] = false;
                }
            }   
        }
    }
    public static void main(String[] args)
    {
        for (int i=0; i<count; i++)
        {
            if (isPrime[i])
            {
                System.out.println(i + " ");
            }
        }
    }
}

Итак... что я делаю не так? Спасибо за помощь!


person SteelDevil    schedule 11.10.2013    source источник
comment
В чем проблема? Ошибка компилятора? Исключение во время выполнения? Неверный вывод? Что-нибудь еще?   -  person Rohit Jain    schedule 11.10.2013
comment
Ошибка компилятора об ошибке публичного статического сита: недопустимое объявление метода; требуется тип возвращаемого значения   -  person SteelDevil    schedule 11.10.2013
comment
Значит, сообщение компилятора недостаточно ясно? Вам нужно указать тип возвращаемого значения для вашего метода sieve().   -  person Rohit Jain    schedule 11.10.2013
comment
Удалив метод и заменив его статическим, он сработал, но почему вы используете только статический без имени метода или типа метода... можете ли вы это объяснить?   -  person SteelDevil    schedule 11.10.2013


Ответы (1)


Что я делаю неправильно?

Вы определили sieve(), но никогда не вызывали его. Вам нужно вызвать его перед печатью:

public static void main(String[] args)
{
    sieve(); // <<== Here
    for (int i=0; i<count; i++)
    {
        if (isPrime[i])
        {
            System.out.println(i + " ");
        }
    }
}

Причина, по которой это работало в книге, заключалась в том, что инициализация выполнялась в конструкторе. Ваш измененный код переместил инициализацию в статическую функцию, но не может вызвать эту инициализацию.

Вам также необходимо удалить параметры из объявления sieve, потому что он уже имеет доступ к isPrime и count.

Альтернативой является полное удаление метода sieve, заменив его статическим инициализатором. Вместо

public static sieve() 
{
    // Code to initialize isPrime
}

записывать

static
{
    // Code to initialize isPrime
}

Это изменение делает метод sieve() статическим инициализатором, который всегда вызывается перед выполнением чего-либо еще в вашем классе.

person Sergey Kalinichenko    schedule 11.10.2013
comment
Хорошо, я добавил его в основной метод, но он все равно выдает ошибку при компиляции: public static sieve(int count, boolean isPrime); - person SteelDevil; 11.10.2013
comment
@SteelDevil Кстати, вам нужно удалить точки с запятой в объявлениях конструктора метода и конструктора - например, я уверен, что в книге нет точки с запятой после Sieve();. - person Sergey Kalinichenko; 11.10.2013
comment
Хорошо, что сделал это! но почему вы используете только static, что он делает как метод? Вы можете это объяснить? - person SteelDevil; 11.10.2013
comment
Спасибо большое за вашу помощь! + для вас, сэр или мэм, или бот, я не знаю, лол :) - person SteelDevil; 11.10.2013