Считать простые числа?

Итак, вот моя проблема, которую я имею для домашней работы.

Напишите программу, которая принимает аргумент командной строки N (целое число, N>= 1) и печатает число простых чисел, меньших или равных N. Число является простым, если оно делится только на себя и 1.

Вот код, который я придумал до сих пор, и я уверен, что в нем много ошибок.

import java.util.Random;

public class PrimeCounter {
    public static void main(String[] args) {
        Random rand = new Random();
        int N = rand.nextInt();

        for(int number = 2; 1 <= N; number++){
            if(isPrime(number)){
                System.out.println(number);
            }
        }
    }

    public static boolean isPrime(int number){
        for(int i=2; i<=number; i++){
            if(number%i == 0){
                return false;
            }
        }
        return true;
    }
}

Какие-либо предложения? Каждый раз, когда я провожу его через юнит-тесты через затмение, я проваливаю все тесты, которые мне дал мой профессор. Из того, как я понимаю назначение, он хочет, чтобы программа взяла число N и распечатала, сколько простых чисел меньше или равно N. Проблема в том, что мы еще не просмотрели входные данные, поэтому я не уверен, как он хочет, чтобы мы делали эту программу без какой-либо строки ввода для N?

2 ответа

Это реализация сита Эратосфена.

public class PrimeCounter {
  public static boolean isPrime(int number){
    if(number == 2 || number == 3 | number == 5 || number == 7) return true;
    return ((number % 2) != 0 && (number % 3) != 0 && (number % 5) != 0 && (number % 7) != 0);
  }

  public static void main(String args[]){
    if(args.length == 0){
      System.out.println("Usage:\n\tjava primecounter <number>");
      System.exit(0);
    }
    int ceiling = Integer.parseInt(args[0]);
    int numberprimes = 0;
    for(int i = 0;i < ceiling;i++){
      if(PrimeCounter.isPrime(i)){
        numberprimes++;
        System.out.println(i);
      }
    }
    System.out.println("Total Number of Primes: " + numberprimes);
  }
}

Может быть запущен как таковой:

javac <file>.java
java  <file> <numberToGoUpTo>

ЗАМЕТЬТЕ, ЧТО ВЫШЕ ВЫШЕ ТОЛЬКО РАБОТАЮТ НА КОМАНДНОЙ ЛИНИИ!
PS: не включает .java,

1: Когда вы запускаете Java-программу через командную строку, вы можете указать "аргументы", которые хранятся в массиве args (для этого и предназначен "String[] args").

Например, команда "java PrimeCounter 1000" запустит вашу программу и сохранит "1000" (в виде строки) в массиве args. Вы можете получить доступ к этому через args[0], который возвращает строку (вам придется преобразовать ее в целое число) в первом слоте массива, который в этом случае будет "1000".

2: Вот некоторые комментарии к вашему коду:

if(isPrime(number)){
    System.out.println(number);
}

Это печатает каждое простое число, а не число простых чисел. Вы должны добавлять 1 к переменной "counter" каждый раз, когда вы найдете простое число, а затем распечатать этот счетчик, когда закончите поиск.

for(int number = 2; 1 <= N; number++){

"1 <= N" переводится как "пока 1 меньше N", но вы хотите продолжить, пока число меньше N.

Другие вопросы по тегам