IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
Closed Topic Открыть новую тему 
> Простое число, Небольшой вопросик ;-)
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Всем привет smile.gif
Вот насчет задачи:

Дано натуральное число п. Является ли оно простым?

а вот решение >>>
Код

program prost; {Џа®ўҐаЄ  зЁб«  ­  Їа®бв®вг (*Їа®б⮥ зЁб«®*)}
Uses CRT;
Var  n,s: longint;
 Function  Simple(n:longint):boolean;
  Var i:longint;simp : boolean   { simp=false, Ґб«Ё ўбваҐвЁ«бп ¤Ґ«ЁвҐ«м зЁб«  n};
  begin
   if n=2 then Simple:=false
   else if n mod 2 = 0 then Simple:=false
   else begin
   simp:=true;
{Здесь начало выделения;-)}
[B]i:=3;
   while (i<=trunc(sqrt(n))) and  simp do
      if n mod i =0 then simp:=false else i:=i+2;
      if simp then Simple:=true else Simple:=false
   end [/B]
{Здесь конец выделения;-)}
  end;
{Ћб­®ў­ п з бвм Їа®Ја л}
BEGIN  clrscr; textcolor(lightgreen);
write(' ‚ўҐ¤ЁвҐ зЁб«® ¤«п Їа®ўҐаЄЁ ­  Їа®бв®вг> ');
readln(n);
if Simple(n) then writeln(' Yes') else writeln(' No');
readln;
END.


Хотелось бы подробно узнать за что отвечает выделенная часть и как она работает, уже неделю не могу разобрать...
P.S. Задачу не сам делал smile.gif
Всем заранее спасибо.

Сообщение отредактировано: Legolas -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


вот можно еще так, я думаю :

 i:=2;flag:=true;
while(i<=9)and(flag) do
if (n<>i)and(n mod i = 0) then
flag:=false
else
inc(i);

if not(flag) then writeln('Simple')
else writeln('No');


хотя можно еще меньше цикл сделать, объявить массив

a[4] = (2,3,5,7) и в цикле

... if (n<>a[i])and(n mod a[i] = 0) then
flag:=false;


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Это выделение лучше переписать вот так:
i:=3;
while (i<=trunc(sqrt(n))) and simp do
begin
simp:=(n mod i <>0);
if simp then i:=i+2;
end;
Simple:=simp;
А если не понятно как работает данный алгоритм, задавай конкретные вопросы.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


может у меня с просони мозг совсем не работает, тогда извеняйте ;) но это :
uses crt;
var i,n:integer;
simp,simple:boolean;

begin
readln(n);
i:=3;simp:=true;
while (i<=trunc(sqrt(n))) and simp do
begin
simp:=(n mod i <>0);
if simp then i:=i+2;
end;
Simple:=simp;
writeln(simple);
end.


всегда true.

вру, не всегда, при n=9 и n=12 - false lol.gif но это ведь не правда)).
hiv , поясни алгоритм smile.gif

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 206
Пол: Мужской

Репутация: -  3  +


Выделенная часть напрямую связана со всей программой. Поэтому разбираем сначала.
Вначале проверяем, делится ли заданное число на 2. Четные числа заведомо не простые. Если же число нечетное, переходим к выделенной части. В этом цикле мы перебираем все возможные нечетные делители, начиная с 3 и заканчивая квадратным корнем из заданного числа. Поскольку для нечетного числа возможны только нечетные делители, то и шаг по i идет через двойку. А почему заканчиваем trunc(sqrt(n)), тоже понятно. Потому что корень из числа это максимальный возможный делитель.
А вот что мне не нравится, так это строка в самом начале:
if n=2 then Simple:=false

Господа маститые, прокомментируйте pls. Неужели я забыл школьную арифметику?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Legolas
Опять изобретаем велосипед ... Чем Этот способ не устраивает?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(Бродяжник @ 23.05.05 9:03)
Неужели я забыл школьную арифметику?

Ты абсолютно прав - это я не доглядел...
Цитата(klem4)
всегда true.

Это был кусок кода - а вот весь:
Function  Simple(n:longint):boolean;
var i :integer;
simp :boolean;
begin
if n=2 then Simple:=true
else
if n mod 2 = 0 then Simple:=false
else
begin
i:=3;simp:=true;
while (i<=trunc(sqrt(n))) and simp do
begin
simp:=(n mod i <>0);
if simp then i:=i+2;
end;
Simple:=simp;
end;
end;


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Всем спасибо.
А насчет изобретения велосипеда, то просто я задачи ищу с помощью поисковиков...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name