Как работает этот тест простых чисел в 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;
}
}