#java #loops #primes #mod #primality-test
#java #циклы #простые числа #мод #primality-test
Вопрос:
Прошу прощения, если это глупый вопрос, я довольно новичок в Java, но я не могу понять, почему мой тест на простоту на основе оператора mod для чисел 1-100 останавливается на 1. Я пытался следовать своему коду, и я не понимаю, почему он не может перейти к последнему оператору else, когда possiblePrime = 2 .
Он должен просто принимать possiblePrime = 2 через операторы if и else if вплоть до последнего оператора else и печатать «2 — простое число». а затем продолжить до possiblePrime = 3, но вместо этого он проходит через циклы, как и должно быть, когда possiblePrime = 1 , как это происходит, когда онинициализируется в начале, а затем полностью останавливается, как только possiblePrime увеличивается в конце последнего оператора else, печатая только «1 — простое число».
Спасибо за любую помощь, которую вы могли бы предложить, это очень ценится! Я определенно ломаю голову, пытаясь разобраться в этом, и я почти на 100% уверен, что это какая-то глупая и очевидная ошибка, которую я просто не вижу.
public class PrimeFind {
public static void main(String[] args){
int possiblePrime = 1;
for(int i = 1 ; i <= 100 ; i ){
int possibleDivisor = 1;
if(possiblePrime%possibleDivisor != 0){
possibleDivisor ;
}
else if(possiblePrime != possibleDivisor){
possiblePrime ;
}
else{
System.out.println(possiblePrime " is a prime.");
possiblePrime ;
}
}
}
}
Комментарии:
1. Вы устанавливаете
possibleDivisor = 1
внутри цикла for. следовательно, он всегда будет равен 1.
Ответ №1:
Вы устанавливаете possibleDivisor = 1
внутри цикла for. следовательно, он всегда будет равен 1. Это, в свою очередь, сделает операцию по модулю равной 0 в каждом случае. possiblePrime всегда будет отличаться от possibleDivisor (1), за исключением 1. Следовательно, вы получаете только 1.
public class PrimeFind {
public static void main(String[] args){
int possiblePrime = 1;
for(int i = 1 ; i <= 100 ; i ){
int possibleDivisor = 1; // Always 1
if(possiblePrime%possibleDivisor != 0){ // Always False because something%1 == 0
possibleDivisor ;
}
else if(possiblePrime != possibleDivisor){ // Always True except for possiblePrime=1
possiblePrime ;
}
else{
System.out.println(possiblePrime " is a prime.");
possiblePrime ;
}
}
}
}
Ответ №2:
Вы поставили неправильные условия, поэтому это происходит, ваш первый оператор if if(possiblePrime%possibleDivisor != 0)
всегда будет оцениваться как false, потому что вы инициализировали possibleDivisor значением 1, и ни одно из чисел не дает значения, отличного от 0, при делении на 1, поэтому в вашем коде оператор possibleDivisor ;
никогда не будет выполняться.
И ваш оператор else if else if(possiblePrime != possibleDivisor)
каждый раз оценивается как true except i=0
. Вот почему он не перейдет в блок else и не напечатает ваше утверждение.
Ваш цикл for не останавливается после i=0
, но только из-за того, что ваш блок else не выполняется, вам кажется, что цикл останавливается после первой итерации.