Считать простые числа?
Итак, вот моя проблема, которую я имею для домашней работы.
Напишите программу, которая принимает аргумент командной строки 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.