|
Оператор прервать. Не могу понять почему так. | ☑ | ||
---|---|---|---|---|
0
Grogan
04.03.20
✎
22:39
|
Решаю задачу вывода простых чисел до 1000. Сначала сделал так:
Для НатуральноеЧисло = 2 По 1000 Цикл ЧислоЯвляетсяПростым = Истина; Для Делитель=2 По (НатуральноеЧисло-1) Цикл Если НатуральноеЧисло%Делитель = 0 Тогда ЧислоЯвляетсяПростым = Ложь; КонецЕсли; Прервать; КонецЦикла; Если ЧислоЯвляетсяПростым = Истина Тогда Сообщить(НатуральноеЧисло); КонецЕсли; КонецЦикла; Программа выводит не простые числа, а числа с шагом в 2. Так: 2, 3, 5, 7 и тд Но если прерываем цикл до КонецЕсли, то программа работает корректно. Почему так? Влиять не должно по идее. Для НатуральноеЧисло = 2 По 1000 Цикл ЧислоЯвляетсяПростым = Истина; Для Делитель=2 По (НатуральноеЧисло-1) Цикл Если НатуральноеЧисло%Делитель = 0 Тогда ЧислоЯвляетсяПростым = Ложь; Прервать; КонецЕсли; КонецЦикла; Если ЧислоЯвляетсяПростым = Истина Тогда Сообщить(НатуральноеЧисло); КонецЕсли; КонецЦикла; Работает корректно. Почему так? Спасибо! Извините за нубство. |
|||
1
azernot
04.03.20
✎
22:42
|
Для Делитель=2 По (НатуральноеЧисло-1) Цикл
Если НатуральноеЧисло%Делитель = 0 Тогда ЧислоЯвляетсяПростым = Ложь; КонецЕсли; Прервать; - прерывание идет на первом же ветке цикла. ВСЕГДА |
|||
2
azernot
04.03.20
✎
22:50
|
Насколько я помню алгоритм решения такой задачи, надо изначально перебирать нечётные числа, и пытатся делить не на любые числа, а а ранее найденные простые. Так будет быстрее.
|
|||
3
АНДР
04.03.20
✎
22:51
|
Для Делитель=2 По (НатуральноеЧисло/2-1) Цикл
|
|||
4
azernot
04.03.20
✎
22:59
|
Лимит = 1000;
МассивПростыхЧисел = Новый Массив(); НатуральноеНечетноеЧисло = 3; Пока НатуральноеНечетноеЧисло<= Лимит Цикл ЧислоЯвляетсяПростым = Истина; Для каждого РанееНайденноеПростоеЧисло Из МассивПростыхЧисел Цикл Если НатуральноеНечетноеЧисло%РанееНайденноеПростоеЧисло = 0 Тогда ЧислоЯвляетсяПростым = Ложь; Прервать; КонецЕсли; КонецЦикла; Если ЧислоЯвляетсяПростым Тогда МассивПростыхЧисел.Добавить(НатуральноеНечетноеЧисло); КОнецЕсли; НатуральноеНечетноеЧисло = НатуральноеНечетноеЧисло + 2; КОнецЦикла; МассивПростыхЧисел.Вставить(0,2); Для каждого НайденноеПростоеЧисло Из МассивПростыхЧисел Цикл Сообщить(НайденноеПростоеЧисло); КонецЦикла; |
|||
5
orefkov
05.03.20
✎
00:42
|
(4)
Эх, молодость моя... Проверять надо не на весь массив ранее найденных, а пока РанееНайденноеПростоеЧисло меньше либо равно корню из проверяемого числа. Ну или РанееНайденноеПростоеЧисло * РанееНайденноеПростоеЧисло <= НатуральноеНечетноеЧисло, в 1989 году Basic слишком долго считал квадратные корни, делали так. |
|||
6
catena
05.03.20
✎
06:36
|
(0)"Влиять не должно по идее." - с чего бы? То, что внутри если выполняется только тогда, когда выполняется условие. А вне если работает всегда.
|
|||
7
Grogan
05.03.20
✎
08:58
|
Спасибо всем отписавшимся, но мне бы с циклами и оператором если разобраться до конца надо, а не задачу решить оптимальным способом) Спасибо конечно что накидали, пища для размышлений будет так сказать.
Но все равно для себя до конца не понял... ( У нас два цикла, перед которыми стоит флаг, присваивающий переменной ЧислоЯвляетсяПростым значение Истина. Внешний цикл перебирает числа, которые нужно проверить на "простоту". Далее внутренний цикл, который перебирает делители. В нем находится условный оператор, если проверяемое число делится на делитель без остатка флаг ЧислоЯвляетсяПростым меняет значение на Ложь. Далее если мы прерываем цикл, перебирающий делители, программа работает корректно, но если мы сначала закрываем оператор условный оператор и ставим КонецЕсли, то программа работает некорректно. Почему так? Что меняется от того что он будет закрыт? Переменные будут иметь одни и те же значения в текущий момент времени, независимо закрыт ли оператор Если. Верно ли? Растолкуйте пожалуйста) |
|||
8
azernot
05.03.20
✎
09:19
|
(7) Команда "Прервать" - прерывает цикл. Т.е. в коде проверяется только один делитель - Двойка. Если натуральное число - чётное, при прерывании цикла ЧислоЯвляетсяПростым = Ложь, если нечётное ЧислоЯвляетсяПростым = Истина. И поэтому тебе сообщаются только нечётные числа.
Прерывать цикл по делителям при поиске простого числа надо именно в тот момент когда найден делитель. В остальных случаях, прерывать цикл не надо. P.S. Может ты путаешь "Прервать" и "Продолжить"? |
|||
9
catena
05.03.20
✎
09:27
|
(7)Оператору Прервать плевать на значения переменных.
Оператор ЕСЛИ не меняет никакие значения переменных. Если НатуральноеЧисло%Делитель = 0 Тогда ЧислоЯвляетсяПростым = Ложь; Прервать; //Сработает только если число делится без остатка КонецЕсли; Преравть; //Сработает всегда, независимо, заходили мы в ЕСЛИ или не заходили |
|||
10
catena
05.03.20
✎
09:28
|
(7)Поставь точку останова и выполни код пошагово.
|
|||
11
Grogan
05.03.20
✎
21:23
|
catena,azernot отдуши! Теперь ясно стало все! Спасибо еще раз!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |