Как работает этот тест простых чисел в Java?

приведенный ниже фрагмент кода проверяет, является ли заданное число простым. Может кто-нибудь объяснить мне, почему это работает? Этот код был в учебном пособии, данном нам для экзамена Java.

public static void main(String[] args)
{    
    int j = 2;
    int result = 0;
    int number = 0;
    Scanner reader = new Scanner(System.in);
    System.out.println("Please enter a number: ");
    number = reader.nextInt();
    while (j <= number / 2)
    {
        if (number % j == 0)
        {
           result = 1;
        }
        j++;
    }
    if (result == 1)
    {
        System.out.println("Number: " + number + " is Not Prime.");
    }
    else
    {
        System.out.println("Number: " + number + " is Prime. ");
    }
}

5 ответов


Общая теория

условие if (number % j == 0) спрашивает, если number - Это точно делится на j

определение Прайм -

число делится только на себя и 1

Итак, если вы проверяете все числа между 2 и числом, и ни одно из них не является точно делимым, то это простое число, иначе это не так.

конечно, вы на самом деле не должны идти весь путь к number, потому что number не может быть точно делимым на что-либо, превышающее половину number.

специальные разделы

цикл

этот раздел проходит через значения увеличения j, Если мы притворимся, что number = 12, то он будет работать через j = 2,3,4,5,6

  int j = 2;
  .....
  while (j <= number / 2)
  {
      ........
      j++;
  }

если заявление

в этом разделе result 1, Если в любой момент number - Это точно делится на j. result никогда сброс до 0, как только это было значение 1.

  ......
  if (number % j == 0)
  {
     result = 1;
  }
  .....

дальнейшего совершенствования

конечно, вы можете улучшить это еще больше, потому что вам на самом деле нужно идти не выше, чем sqrt(number) но этот фрагмент решил этого не делать; причина, по которой вам не нужно идти выше, заключается в том, что если (например) 40 точно делится на 4, это 4*10, вам не нужно тестировать как для 4, так и для 10. И из этих пар одна всегда будет ниже sqrt(number).

также стоит отметить, что они, кажется, намеревались использовать result как логическое, но на самом деле используются целые числа 0 и 1 для представления true и false. Это плохая практика.


Я попытался прокомментировать каждую строку, чтобы объяснить происходящие процессы, надеюсь, что это помогает!

int j = 2;   //variable
int result = 0; //variable
int number = 0; //variable
Scanner reader = new Scanner(System.in); //Scanner object
System.out.println("Please enter a number: "); //Instruction
number = reader.nextInt(); //Get the number entered
while (j <= number / 2) //start loop, during loop j will become each number between 2 and 
{                             //the entered number divided by 2
    if (number % j == 0) //If their is no remainder from your number divided by j...
    {
        result = 1;  //Then result is set to 1 as the number divides equally by another number, hergo
    }                //it is not a prime number
    j++;  //Increment j to the next number to test against the number you entered
}
if (result == 1)  //check the result from the loop
{
    System.out.println("Number: " + number + " is Not Prime."); //If result 1 then a prime   
}
else
{
    System.out.println("Number: " + number + " is Prime. "); //If result is not 1 it's not a prime
}    

он работает путем итерации по всему числу от 2 до половины введенного числа (так как любое число, большее, чем вход/2 (но меньше, чем вход), даст дробь). Если входное число делится на j дает 0 остаток (if (number % j == 0)) тогда число input is делится на число, отличное от 1 или само по себе. В этом случае result имеет значение 1, а число не является простым числом.


Ява Ява.математика.Класс BigInteger содержит метод isProbablePrime (int уверенность) чтобы проверить простоту числа.

isProbablePrime(int certainty): метод BigInteger класс, чтобы проверить, является ли данное число простым. Для certainty = 1, он возвращает true, если BigInteger - простое и false, если BigInteger составное.

алгоритм примитивности Миллера–Рабина используется для проверки примитивности в этом методе.

import java.math.BigInteger;

public class TestPrime {

    public static void main(String[] args) {
        int number = 83;
        boolean isPrime = testPrime(number);
        System.out.println(number + " is prime : " + isPrime);

    }

    /**
     * method to test primality
     * @param number
     * @return boolean
     */
    private static boolean testPrime(int number) {
        BigInteger bValue = BigInteger.valueOf(number);

        /**
         * isProbablePrime method used to check primality. 
         * */
        boolean result = bValue.isProbablePrime(1);

        return result;
    }
}

Output: 83 is prime : true

дополнительные спасибо блог.


попробуйте

public class PalindromePrime   {
     private static int g ,k ,n =0,i,m ; 

     static String b ="";
    private static Scanner scanner = new Scanner( System.in );

    public static void main(String [] args) throws IOException {

        System.out.print(" Please Inter Data : "); 
        g = scanner.nextInt();  

        System.out.print(" Please Inter Data 2  : "); 
        m = scanner.nextInt();

        count(g,m);


        }

//      
        //********************************************************************************    


    private static    int count(int L, int R) 

        for( i= L ; i<= R ;i++){
            int count = 0 ;
            for( n = i ; n >=1 ;n -- ){

                if(i%n==0){

                    count = count + 1 ;
                }           
            }
            if(count == 2)
            {       
                b = b +i + "" ; 
            }   

        }

        System.out.print("  Data  : "); 
        System.out.print("  Data : \n "  +b );  

        return R;

        }
}