Я использую приведенный ниже код, и он дает мне возможность ввести окончательное значение, но мне нужно ввести два значения, а также общее количество простых чисел между этим диапазоном.

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please enter two positive integers: ");
    int input = scanner.nextInt();
    List<Integer> primes = new ArrayList<>();

    // loop through the numbers one by one
    for (int i = 2; i < input; i++) {
        boolean isPrimeNumber = true;

        // check to see if the number is prime
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPrimeNumber = false;
                break; // exit the inner for loop
            }
        }

        // print the number if prime
        if (isPrimeNumber) {
            primes.add(i);
        }
    }
    System.out.println("The number of prime is: " + primes.size());

    System.out.println(primes.toString());
}
0
javabeginner 18 Янв 2022 в 23:12
1
В чем именно ваша проблема? Код, который вы разместили, делает именно то, что вы говорите. Он принимает ввод, находит простые числа между 0 и вводом и выводит количество простых чисел, а также все простые числа?
 – 
David Tejuosho
18 Янв 2022 в 23:36

3 ответа

Все, что вам нужно, это запросить у пользователя два целых числа, используя Scanner два раза.

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Please enter two positive integers:");

    System.out.print("low range: ");
    int lo = scan.nextInt();

    System.out.print("high range: ");
    int hi = scan.nextInt();
    List<Integer> primes = getPrimeNumbers(lo, hi);

    System.out.println("The number of prime is: " + primes.size());
    System.out.println(primes);
}

private static List<Integer> getPrimeNumbers(int lo, int hi) {
    List<Integer> primes = new ArrayList<>();

    for (int i = lo; i <= hi; i++)
        if (isPrime(i))
            primes.add(i);

    return primes;
}

private static boolean isPrime(int val) {
    if (val == 1)
        return false;
    if (val == 2 || val == 3)
        return true;

    for (int i = 2, sqrt = (int)Math.sqrt(val); i <= sqrt; i++)
        if (val % i == 0)
            return false;

    return true;
}
1
oleg.cherednik 18 Янв 2022 в 23:51

Ваш, но хорошо, но не совсем так, как вы описали.

scanner.nextInt() — может выдать только одно целое значение (или вызывает InputMismatchException, если ввод не является целым числом).

Вы сказали 'мне нужно ввести два значения' - для этого вам, возможно, придется прочитать эти значения отдельно, используя nextInt(), или вы можете прочитать оба значения как строку , затем разделите строку и проанализируйте в int отдельно. Первый вариант однозначно проще.

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please enter two positive integers: ");
    System.out.print("start = ");
    int start = scanner.nextInt();
    System.out.print("end = ");
    int end = scanner.nextInt();

    List<Integer> primes = new ArrayList<>();

    // loop through the numbers from start to end inclusive
    for (int i = start; i <= end; i++) {
        // check if i is prime
        if (isPrime(i)) {
            primes.add(i);
        }
    }
    System.out.println("The number of prime is: " + primes.size());
    System.out.println(primes);
}

private static boolean isPrime(int i) {
    boolean isPrime = true;
    // check to see if the number is prime
    for (int j = 2; j < i / 2; j++) {
        if (i % j == 0) {
            isPrime = false;
            break; // exit the inner for loop
        }
    }
    return isPrime;
}

Дайте нам знать, пожалуйста, это то, чего вы хотели добиться?

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

Чтобы повысить производительность вместо того, чтобы слепо перебирать весь диапазон значений снова и снова, необходимо повторно использовать уже обнаруженные простые числа.

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

1
Alexander Ivanchenko 19 Янв 2022 в 00:24
2
Это комментарий, а не ответ.
 – 
hfontanez
18 Янв 2022 в 23:41
Будет ли это, если я предоставлю свой комментарий с кодом?
 – 
Alexander Ivanchenko
18 Янв 2022 в 23:43
1
Один момент, я отредактирую это
 – 
Alexander Ivanchenko
18 Янв 2022 в 23:44
Это гораздо лучше!
 – 
hfontanez
18 Янв 2022 в 23:57
  1. используйте два сканера, чтобы получить второй ввод
  2. вы можете удалить список и добавить в него элементы и использовать счетчик, если вам нужно только количество простых чисел :)

Итак, решение было бы таким:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please enter the first positive integer: ");
    int firstNumber = scanner.nextInt();
    System.out.println("Please enter the second positive integer: ");


// you should have another scanner hence an other text output to invite user
    int secondNumber = scanner.nextInt();

    List<Integer> primes = new ArrayList<>(); // we do not really need this if we want only the number of prime number and not the list but i'll use it for you anyway

    for(int i = firstNumber; i <= secondNumber; i++) //the use the input variables
    {
        if (isPrime(i)){ // we made a function here to make things clear. it's role to tell weather a number is a prime or not
            primes.add(i); // we add prime numbers to this list as you used a  list. You can go for an easier solution just a counter++ each time ;)
        }
    }

    System.out.println("The number of prime numbers in this range is: " + primes.size());

}
static boolean isPrime(int num){
    if (num <= 1)
        return false;
    for(int i = 2; i * i <= num; i++)
        // If a divisor of n exists
        if (num % i == 0)
            return false;

    return true;
}
0
Nizar YAKOUBI 18 Янв 2022 в 23:51