A. J. Bozdar Ответов: 2

Как происходит разрыв нижеприведенной петли?


Не могли бы вы сказать мне, как здесь ломается второй цикл или оператор if?
int outer;
int inner;

for (outer = 2; outer < 100; outer++)
{
    for (inner = 2; inner < 100; inner++)
        if ((outer % inner) == 0)  break;
    if (inner > (outer / inner))
        Console.WriteLine("{0} is prime", outer);
}


Что я уже пробовал:

Я изменил код, как показано ниже, чтобы понять второй цикл, но тогда он печатает только "break".
for (inner = 2; inner < 100; inner++)
     if ((outer % inner) == 0) Console.WriteLine("Breaks Here!"); break;


Спасибо.

2 Ответов

Рейтинг:
4

Patrice T

Цитата:
Я был бы очень признателен, если бы кто-то мог указать мне правильное направление, чтобы понять эту логику "простых чисел".

Эта простая логика проверки чрезвычайно медленная.
Подумайте об этом, когда вы проверяете, является ли 97 простым числом, вручную (только с помощью калькулятора), как только вы знаете, что 2 не является фактором, вы проверите 4, 6, 8, 10, 12 ... ?
Когда ты остановишься ? Почему? вы проверите 95 ? 93 ? 91 ? 89 ? ...
Совет: сделайте функцию "isprime", это упростит код.

Цитата:
Не могли бы вы сказать мне, как здесь ломается второй цикл или оператор if?

Как насчет просмотра кода, как он работает ?

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

OriginalGriff

Цитата:
Я изменил код, как показано ниже, чтобы понять второй цикл, но тогда он печатает только "break".
Это не петля, которая делает это - это if Давайте просто переформатируем ваш код, чтобы его было легче увидеть:
for (inner = 2; inner < 100; inner++)
     if ((outer % inner) == 0) Console.WriteLine("Breaks Here!"); break;
Становится:
for (inner = 2; inner < 100; inner++)
   if ((outer % inner) == 0) 
      Console.WriteLine("Breaks Here!"); 
   break;
И теперь это очевидно: оператор break выполняется независимо от условия.
Если вы хотите распечатать и сломать, вам понадобятся фигурные скобки:
for (inner = 2; inner < 100; inner++)
   if ((outer % inner) == 0) 
      {
      Console.WriteLine("Breaks Here!"); 
      break;
      }
На самом деле, как новичок, я бы настоятельно рекомендовал вам использовать фигурные скобки все время, даже если вам это не нужно - это делает подобные проблемы гораздо менее вероятными:
for (int outer = 2; outer < 100; outer++)
   {
   for (inner = 2; inner < 100; inner++)
      {
      if ((outer % inner) == 0)  
         {
         break;
         }
      }
   if (inner > (outer / inner))
      {
      Console.WriteLine("{0} is prime", outer);
      }
   }


Richard Deeming

В блоке переформатированного кода break отступ на один уровень слишком далеко. :)

Так как нет никаких брекетов, это должно быть:

for (inner = 2; inner < 100; inner++)
   if ((outer % inner) == 0) 
      Console.WriteLine("Breaks Here!"); 

break;

OriginalGriff

Хорошая мысль!