![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
Luck_brt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.2.2007 Репутация: нет Всего: нет |
Доброго времени суток, вам.
Проблема такая, начал недавно изучать язык Perl. И сталкнулся с проблемой. Есть код (был в мануале ![]() Заранее очень благодарин. Ниже код. #!/usr/bin/perl -w $maxprimes=20; $value=1; $count=0; while ($count<$maxprimes) { $value++; $compasite=0; OUTER: for ($i=1;$i<$value ;$i++) { for ($j=1;$j<$value ;$j++) { if (($i*$j)==$value) { $compasite=1; last OUTER; } } } if (1==$compasite) { $count++; print "$value "; } } P.S. Я думаю не то что я не могу найти вызод из ситуаци потому что у меня не хватает мозгов, я думаю потому что я еще токо знаю азы интерпретатора Perl. (Но это сугубо мое мнение ![]() Это сообщение отредактировал(а) Luck_brt - 7.9.2007, 11:26 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
Да...
Заменить 1==$compasite на 1!=$compasite, и будут печататься не составные, а простые числа. |
|||
|
||||
Luck_brt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.2.2007 Репутация: нет Всего: нет |
Спасибо!!! Слушай пожалсто, если будет время напиши, как так ???? ))) Нифига не могу догнать, даже когда ответ вот он... ((( |
|||
|
||||
Luck_brt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.2.2007 Репутация: нет Всего: нет |
Прошу Вас кому не тяжело, напишите, почему, так ???
|
|||
|
||||
apook |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: нет Всего: 23 |
анализ кода показал что сей код делает следующее:
1. воспроизводит числа от 0 до 20-и но цифру 20 можно поменять хоть на какую 2. далее походу воспроизведения каждого числа это число он отсчитывает с 1 до этого числа т.е если 4 то 1 2 3 4 при это по ходу уже этого счета каждое число он пытается перемножить со всеми читслами из которых он состоит т.е если это число 4 то будет так
причем сама четверка не учавствует в умножении странным образом т.е не будет действия 1*4 потому что условие сравнения такое
а не
при этом каждое полученное число будет проверяеться на равенство 4 и если хоть один раз оно было равно 4-ем то получается(если программа правильная) это составное число... От сюда вывод что этот код составными считает те которые можно получить из чисел из которых состоит это чисо путем уиножения ![]() Воооот может разберешься, а может наоборот запутаешься??? Кстати я не понял значение строчки
и
вот тот-же вариант без этих строчек
Это сообщение отредактировал(а) apook - 10.9.2007, 10:59 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||||||||||
|
|||||||||||||
Luck_brt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.2.2007 Репутация: нет Всего: нет |
Нее, большое спасибо!!! Немного понял, не на все 100% но я пока токо 1раз прочитал
![]() А на счет этих строк, то просто, Вам ли незнать программирование это как искуство, каждый сочиняет как может ![]() Это сообщение отредактировал(а) Luck_brt - 10.9.2007, 08:01 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 9 Всего: 50 |
Ну это то ясно. Как только находится пара $i и $j такая, что ($i*$j)==$value, то значит, число $value - составное, дальше перебирать $i и $j не имеет смысла, и переходим к следующему $value. Это экономит время счета (если вообще можно говорить об экономии при таком алгоритме).
|
|||
|
||||
apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: нет Всего: 23 |
Осторожно, здесь что-то не то!
Простое число это то число которое имеет ровно два натуральных делителя единицу и саму себя (см. здесь).... Я внес изменеия в предыдущий пост, добавил неразберихи, то что я обьяснял сперва это был поиск составных чисел, далее как сказал amg, меняем == на != и получаем поиск каких то других чисел(вродь получается что простых) Извини за путанницу Это сообщение отредактировал(а) apook - 10.9.2007, 11:02 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
Luck_brt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.2.2007 Репутация: нет Всего: нет |
Теперь опять что то не так... Почему (1==$compasite) выдает составные а (1!=$compasite) выдает уже простые числа ??? я так понимаю что $compasite не равно 1-му то просто $count увеличеваеться и соответсвенно увеличиваеться счетчик найденых чисел. Но я так и непойму как $compasite обозначает что число являеться простым ? То что там перебираеться и переумножаеться, это тоже понятно. Но причем тут $compasite так и не понятно...
Это сообщение отредактировал(а) Luck_brt - 11.9.2007, 05:59 |
|||
|
||||
apook |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: нет Всего: 23 |
Слухай сюда:
так как уже следующие вычисления уже лишние, те к примеру строки
эту проблему как раз и решали(я просто новичек в Perl сразу не вьехал) Далее идет проверка
Стало быть изначально код предназначен находить сосавные числа, [для справки составное число это число не являющееся простым, Каждое составное число является произведением двух натуральных чисел больших 1], так если мы меняем == на != получаяется что производится поиск не таких чисел и если составное число это число не являющееся простым то не такое число это то число являющееся простым. Вот тока исходя из этого походу! -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
||||||||||
|
|||||||||||
varnie |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 27.9.2007 Репутация: нет Всего: 0 |
забыл добавить, это решение официально расписано в википедии о perl Это сообщение отредактировал(а) varnie - 27.9.2007, 07:04 |
|||
|
||||
fantome |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 5.2.2007 Репутация: нет Всего: 1 |
varnie,
но это решение не эффективно по памяти, как там сказано... Но красивое не спорю... +1 а если надо написать прогу, которая будет искать простые числа - то лучше сначала покопаться в алгоритмах... По крайней мере проверку на деление можно вести не до самого числа, а до корня квадратного из него... И много еще чего можно придумать... В свое время я на си реализовывал алгоритм генерации простых чисел для ЭЦП ГОСТ Р 34.10, пардон конечно за отступление от темы... строчка
перебрасывает выполнение на последнюю строку цикла... насколько мне известно... то есть перебор продолжится дальше для новых значений $i , но значение $compasite уже установили в 1... А его сброс в 0 идет перед первым циклом for. Это сообщение отредактировал(а) fantome - 27.9.2007, 07:56 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |