Отделяйте простые числа от массива - PullRequest
0 голосов
/ 05 сентября 2018
public class HelloWorld {

    public static void main(String []args) {

        int [] arr = {2, 5, 9, 6, 7, 13, 24, 42, 8};
        int [] arr1 = new int[4];
        int [] arr2 = new int[arr.length - arr1.length];

        for(int i = 0; i < arr.length; i++) {
            for(int j = 2; j <= arr[i]/2; j++) {
                if(arr[i] % j == 0) {
                    System.out.println("Number is not prime " + arr[i]);
                    break;
                }
                else {
                    System.out.println("Number is prime " + arr[i]);
                    break;
                }
            }
        }
    }
}

Программа должна проверить массив чисел и вывести, если данное число простое. Что-то не так, поскольку первые 2 не помечены как простые. Тогда я не знаю, почему 9 было принято как простое число.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

В вашем коде несколько проблем.

  1. Почему 2 не принимается за простое число. Как объяснили другие, j <= arr[i]/2 является виновником. Согласно этому условию j <= 1 и j == 2. Итак, цикл не выполняется.
  2. Почему 9 принимается за простое число. Впервые при j == 2 и arr[i] == 9. Как 9%2 != 0, число печатается как простое число.

    for(int j = 2; j <= arr[i]/2; j++){
        if(arr[i] % j == 0){
            System.out.println("Number is not prime " + arr[i]);
            break;
        }
        else {
            System.out.println("Number is prime " + arr[i]);
            break;
        }
    }
    

Совет: Вместо проверки arr[i]/2 вы можете использовать вместо этого квадратный корень из числа.

При необходимости вы можете обратиться к следующей программе:

public class PrimeNumber {
    public static void main(String []args){

        int [] arr = {2,3,4,5,9,6,7,13,24,42,8,400,101};
        int [] arr1 = new int[4];
        int [] arr2 = new int[arr.length - arr1.length];
        boolean flag = true;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == 2 || arr[i] == 3 )
            {
                System.out.println("Number is prime " + arr[i]);
                continue;
            }
            flag = true;
            for(int j = 2; j <= Math.sqrt( arr[i] ); j++){
                if(arr[i] % j == 0){
                    System.out.println("Number is not prime " + arr[i]);
                    flag = false;
                    break;
                }
            }
            if ( flag )
            {
                System.out.println("Number is prime " + arr[i]);
            }
        }
    }
}
0 голосов
/ 05 сентября 2018
for (int j = 2; j <= arr[i] / 2; j++) {
    if (arr[i] % j == 0) {
        System.out.println("Number is not prime " + arr[i]);
        break;
    } else {
        System.out.println("Number is prime " + arr[i]);
        break;
    }
}

Здесь вы повторяете только один раз и проверяете, делится ли данное число на 2 или нет (то есть это равно arr[i] % 2 == 0). Чтобы проверить, является ли данное число простым или нет, вы должны проверить все числа от 2 до sqrt (val) .

Я рекомендую вам выбрать эту проверку отдельным методом.

import java.util.function.IntPredicate;

final IntPredicate isPrime = val -> {
    if (val < 2)
        return false;

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

    return true;
};

А ваш код выглядит намного проще:

int[] arr = { 2, 5, 9, 6, 7, 13, 2, 4, 42, 8 };

for (int val : arr) {
    if (isPrime.test(val))
        System.out.println("Number is prime " + val);
    else
        System.out.println("Number is not prime " + val);
}
0 голосов
/ 05 сентября 2018

вам нужно удалить это условие в вашем втором цикле for j <= arr [i] /2.</p>

То, что вы ищете, это j <= arr [i] </p>

...