Нужна помощь в обнаружении логической ошибки в моей программе (простые числа) / понимание вывода

#java #for-loop #nested #primes

#java #для цикла #вложенный #простые числа

Вопрос:

Прежде чем вы прокомментируете: Я понимаю, что это более эффективные способы сделать это, и они уже есть. Я просто чувствую, что понимание процесса здесь сделает меня лучшим программистом.
Новичок в программировании.Следующий псевдокод, который я видел в классе. Я написал программу, которая принимает целое число и печатает каждое простое число до целого числа включительно (userinput). Это то, что я придумал:

 //Import Scanner.
import java.util.Scanner;

//Create class.
public class QuestionTwoA2
{
    public static void main(String[] args)
    {
      System.out.println("Enter an integer:");  //Ask for user input.

      int userInteger;  //Create scanner object and collect user input.
      Scanner keyboard = new Scanner(System.in);
      userInteger = keyboard.nextInt();

      boolean primeFlag = true; //Condition required for prime number loop.
      int outer; //I localised these variables outside the loop so that I
      int inner; //could test output by printing it.

      //Checks natural numbers   in between 2 and userInteger. 
      for (outer = 2; outer < userInteger; outer  )
      {


        for (inner = 2; inner < outer; inner  )
        {


            if (outer % inner == 0)
            {
                primeFlag = false;
                //System.out.println(outer   " "   inner);
                break;

            }

        }
        if (primeFlag)  //I think this statement causes a logic problem.                
            System.out.println(outer);
    }

}
  

}

У меня есть / были операторы печати в разных частях моего кода, просто чтобы визуализировать, какие значения я сравниваю, чтобы получить остаток. Мой текущий вывод (для любого целочисленного ввода):

 Enter an integer:
9
2
3
  

Логически мой код выглядит нормально, но, очевидно, не работает, помощь в объяснении того, что происходит на самом деле, была бы очень признательна.

Комментарии:

1. установите primeFlag=true перед внутренним циклом

2. Вы никогда не устанавливаете primeFlag в его начальное значение после установки его false .

Ответ №1:

Вы должны поместить «логический primeFlag = true;» внутри первого для и перед вторым для. Поскольку second for предназначен для определения того, является ли «внешняя» переменная простым числом или нет, поэтому, прежде чем переходить к этому, вы должны сначала установить свой флаг true, который является вашим предположением, и во втором цикле, когда вы проверяете все меньшие значения, чтобы увидеть, действительно ли оно простое или нет, и измените значениеотметьте, если нет.

Комментарии:

1. Будет ли 2 всегда печатать, потому что для первой итерации внешнего цикла for «логический primeFlag = true» имеет значение true?

2. или это потому, что при outer = 2 и inner = 2 для первой итерации outer условие для внутреннего цикла не выполняется, поэтому «логический primeFlag = true»?