Er. Dinesh Sharma Ответов: 4

Для конструкций разрыва цикла


Привет Эксперты

Я видел for loop в приведенной ниже манере так много раз, но я не понимаю логики, стоящей за этим, чтобы использовать его таким образом.

for(int i=2;i<=num/2;i++)


Почему мы делим num/2 как разрыв цикла?

В приведенной ниже программе оба дают один и тот же результат, но почему в первом подходе мы будем использовать num/2?

//First Approach 
public static void IsPrimeNumber1(int num)
        {
            int Count=0;
            for(int i=2;i<=num/2;i++)
            {
                if(num%2==0)
                {
                   Count++;
                    break;
                }
            }
            if(Count==0 && num!=1)
            {
                Console.WriteLine("Prime Number");
            }
            else
            {
                 Console.WriteLine("Not Prime Number");
            }
        }
//Second Approach
 public static  void IsPrimeNumber2(int num)
        {
            int i=2;
            for( i=2;i<=num-1;i++)
            {
                if(i%num==0)
                {
                    Console.WriteLine("Not Prime Number");
                    break;
                }
            }
            if (num == i)
            {
                Console.WriteLine("Prime Number");
            }
            else
            {
                Console.WriteLine("Not Prime Number");
            }
        }




Спасибо
Динеш Шарма

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

Я попытался найти логику деления на 2 в качестве цикла для разрыва.

PIEBALDconsult

Эти две функции делают очень разные вещи.
Первый не делает того, что предполагает его название, а цикл for не делает ничего, кроме пустой траты времени.
Второй делает это, но одним из наименее эффективных способов.

Patrice T

Нет, второй тоже тратит время впустую, потому что тест делается задом наперед
тест должен быть сделан с num%i вместо i%num

BillWoodruff

Ваш код запутан, глючит; это наводит меня на мысль, что вы не изучаете основы программирования на C# должным образом. Не чувствуйте себя "плохо" из-за этого ... все здесь когда-то были новичками, и мы учимся на своих ошибках !

Я настоятельно рекомендую вам получить хороший .NET book, как и (бесплатный, онлайновый pdf-файл, который вы можете скачать) книга ".NET Book Zero" Чарльза Петцольда:

http://www.charlespetzold.com/dotnet/

И сделайте тщательное изучение глав.

Patrice T

Вопрос предполагает, что ОП не является автором кода.

BillWoodruff

Тем больше причин для ОП получить хорошую книгу и приступить к работе ! :)

Patrice T

вот почему я предоставил ссылки на книгу K&R в своем ответе.

4 Ответов

Рейтинг:
1

PIEBALDconsult

Потому что разработчик не знает, что он должен начать с 3, шаг за шагом 2, и остановитесь на sqrt(num) типичная ошибка новичка.


BillWoodruff

+5

Рейтинг:
1

Patrice T

Цитата:

for(int i=2;i<=num/2;i++)

Почему мы делим num/2 как разрыв цикла?
Мы не.
Этот код представляет собой цикл, который прерывается, когда i преодолевать num/2.

Подумайте о том, как вы проверяете, является ли число простым, что вы делаете, когда вы останавливаетесь ?
Возьмите лист бумаги, карандаш и запишите, что вы делаете, чтобы проверить 31.

Ваша программа очень глючит, используйте отладчик, чтобы увидеть, что делает код.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

[Обновление]
Кстати, вместо того, чтобы пробовать код, который вам дали и который не работает,
попробуйте написать свой собственный, хуже не бывает.
Отличная лекция для изучения языка Си
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]


BillWoodruff

Мой голос №2: Если вы внимательно посмотрите на код OP (очень запутанный, глючный), вы увидите, что они используют 'num%2 == 0 в качестве условия разрыва.

Patrice T

:( ОП пытается понять глючный код, который он где-то нашел, это пустая трата времени.
Я знаю, но постоянного тестирования четности числа никогда не было достаточно, чтобы определить, является ли число простым или нет.
Вы видели другое условие разрыва i%num==0 ?
это даже лучше.

BillWoodruff

Добавление путаных советов к ошибочному коду не улучшает ни ОП, ни их вопрос.

Рейтинг:
1

MichaelMGobrial

Я думаю, вы хотели написать:

if(num%i==0)

Вместо
if(num%2==0)

для первого подхода.
Цикл for действительно прерывается на (num/2), потому что нет простого числа, которое можно было бы разделить на любое число, большее его половины.
Это, безусловно, здорово для сложности, как указано в решении № 3. чем раньше цикл заканчивается без дополнительной проверки, тем менее сложным является этот фрагмент кода и тем более эффективным он становится при работе с большими числами.


Рейтинг:
1

Rais Shaikh

Поскольку num/2 будет принимать половину чисел. например, у нас есть 10 чисел, мы выполняем этот цикл до 5, чтобы проверить, является ли число простым или нет, нет необходимости проверять дальше для 6,7..9.
Когда мы взяли num-1 для цикла будет выполняться больше, чем (num/2), так что для терминов сложности num /2 хорошо.


PIEBALDconsult

7 больше не является простым?

Rais Shaikh

Для 7 он показывает правильный результат. Для любого простого числа нам нужно проверить num /2, Далее нам не нужно проверять. Мы получаем результат в (num/2).

Philippe Mori

Остановка в num / 2 не хороший- Может быть, ты спал на своем компьютерном курсе! Как указано в решении 2, нет никакого смысла в тестовых числах выше квадратного корня из num.

Например, с 10 вам нужно только проверить, делится ли это число на 2 или 3. 10 не является простым числом, так как 10/2 равно 5. С другой стороны, 11 будет простым числом, так как 11% 2 равно 1, а 11% 3 равно 2.