Помощь - Поиск - Пользователи - Календарь
Полная версия: Нахождение простого числа.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
urbAn
Я начинающий в этом деле , изучаю паскаль вторую неделю - но не могу разобратся с блоксхемой для данной задачи.

Задача:
Ввести число B ( обязательно не простое число ) . Найти ближайшее простое число к числу B (например B=9 то ближайшее должно получится 11 , а если 20 то ближайшее 23 ).

Впринципе понятно что надо писать программу при использовании циклов .И при использовании ( while и repeat ). Если кому то не лень повозится с новичком , то обьясните пожалуйсто.
мисс_граффити
как ты видишь алгоритм поиска? можешь расписать по пунктам?
типа так:
1) ввели число В
2) ...
3) ...
ну или хотя бы словами - какие циклы, какие условия выхода из них, зачем они нужны...
без привязки к паскалю... по сути - что перебирать будешь
klem4
Цитата
например B=9 то ближайшее должно получится 11


а почему например не 7 ?

Цитата
а если 20 то ближайшее 23


а по моему 19 blink.gif

urbAn
Цитата(klem4 @ 30.09.2007 17:58) *

а почему например не 7 ?



а по моему 19 blink.gif


Честно говоря так было в задании написано.

По поводу блок схемы:
1) Вводим число N ( ну в данном случае 9 )
2) Впринципе также надо вводить делитель K или не вводить чтобы он уже был , но это помоему не столь важно.
3) N делим на K если остаток 0 то к N прибавляем 1 и опять делим
4) В случае если есть остатоу - например 9:2 =4 (1) то к делителю прибавляем 1

Только тут зацикленность получается - и я не совсем понимаю как вылезти из этого...
мисс_граффити
blink.gif
Цитата
3) N делим на K если остаток 0 то к N прибавляем 1 и опять делим

допустим, мы ищем ближайшее к 20 простое число
ввели k=5
делится.
21 на 5 не делится... прибавляем 1. 21 на 5 не делится. 6 - не делится, 7 - делится...
почему, кстати, прибавляем, а не отнимаем?

мой тебе совет: поищи по форуму, как проверить, является ли число простым. и разберись с этим для начала...
urbAn
Что такое простое число я знаю - в школе я учился . Оно делится на 1 или на само себя и всё.
compiler
Цитата(urbAn @ 1.10.2007 15:16) *
Что такое простое число я знаю - в школе я учился . Оно делится на 1 или на само себя и всё.
я думаю имелось ввиду как в прграмме проверить...
urbAn
unsure.gif да - видимо я не совсем понял.
Neznaika
Наверно уже не нужно, но я кажется знаю, что urbAn имеет в виду.


program Prog;

{ Проверка составного числа: Check. }
function Check( B : Integer ) : Boolean;
var
I : Integer;
begin
Check := TRUE;
for I := 2 to Trunc(Sqrt(B)) do
if (B mod I) = 0 then
Exit;
Check := FALSE
end; { Check }

var
B, I, X : Integer;
begin
Write('Введите число: ');
ReadLn(B);
if B < 2 then
begin
Write('ОШИБКА: ',B,' < 2!');
Exit
end;
if not Check(B) then
begin
Write('ОШИБКА: ',B,' - простое число!');
Exit
end;
{ === Решение задачи === }
X := 0;
for I := B + 1 to MAXINT do
if not Check(I) then { Найдено простое число! }
begin
X := I;
Break
end;
if X <> 0 then
Write('Ближайшее простое число после ',B,' равно ',X,'.')
else { X = 0! }
Write('Число не найдено.')
end.



Зачем я это написал?
Эта программа является "примером", показывающим зачем нужны подпрограммы:
Цитата
Когда в разных частях программы выполняются несколько одинаковых действий
(они решают одну и ту же задачу с возможно разными исходними данными и результатом),
такие действия лучше выделить в подпрограмму.

Для начинающих...
volvo
Цитата
Зачем я это написал?
Вот именно, непонятно... У автора вроде о подпрограммах - ни слова, хотя о циклах было (причем, заметь, было о циклах While/Repeat, ты же пользуешься For-ом...).

Это первое... Второе - извини меня, но с точки зрения usability программа никакая - ты же везде используешь not Check, так зачем, спрашивается, ты сделал функцию проверки составного числа, и используешь ее для проверки, является ли число простым? Процессор слишком мощный? Или ты думаешь, что раз пишешь пример "для начинающих", то "и так сойдет"? Не сойдет... Если ты привык писать программы неверно, то пиши... А вот учить других (тем более, начинающих) - не надо... И не начинай мне сейчас приводить ассемблерные листинги, "доказывающие" что-то... Неинтересно оно мне. Когда меня будет интересовать экономия 10 процессорных тактов не программу из 50000 строк кода - я буду писать на ассемблере. Здесь - раздел "Паскаль". И программа, которая написана (по твоим же словам) для начинающего, должна быть ему интуитивно понятна, вот мне непонятно почему нельзя было воспользоваться IsPrime, и обойтись без NOT.

Если можно более чем в одном месте программы избавиться от not-а, то это надо сделать (перечитай свою же цитату).
Neznaika
Впринципе понятно что надо писать программу при использовании циклов - это не задание,
а размышление решающего задачу, я надеюсь.

Про NOT - согласен, пометять местами TRUE и FALSE и NOT не нужен. IsPrime не крал.
Удивительно, но текст совпал один в один.

Про процессор/assembler не согласен - добавление/удаление NOT не влияет на скорость результирующего кода.

А почему вообще можно здесь использовать отрицание? (Функция Check проверяет не любые числа!)
Потому, что первый условный оператор "удаляет" из множества целых чисел те из них,
которые не являются ни простыми, ни составными(1, 0 и на всякий случай все отрицательные числа).
Поэтому далее число B может быть или простым или составным.
По-моему, хорошо когда есть над чем хоть немного подумать, а не сразу CtrlC-CtrlV-Print-преподаватель.

И for - самый главный ЦИКЛ для начинающих. Он напрямую связан с понятием последовательности
(вообще с нумерацией чего-либо). Я так думаю.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.