| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Программа по нахождению простых чисел... |
| Автор: Luck_brt 7.9.2007, 11:23 |
| Доброго времени суток, вам. Проблема такая, начал недавно изучать язык 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. (Но это сугубо мое мнение |
| Автор: amg 7.9.2007, 12:01 |
| Да... Заменить 1==$compasite на 1!=$compasite, и будут печататься не составные, а простые числа. |
| Автор: Luck_brt 7.9.2007, 13:48 | ||
Спасибо!!! Слушай пожалсто, если будет время напиши, как так ???? ))) Нифига не могу догнать, даже когда ответ вот он... ((( |
| Автор: Luck_brt 10.9.2007, 05:48 |
| Прошу Вас кому не тяжело, напишите, почему, так ??? |
| Автор: apook 10.9.2007, 07:40 | ||||||||||||
| анализ кода показал что сей код делает следующее: 1. воспроизводит числа от 0 до 20-и но цифру 20 можно поменять хоть на какую 2. далее походу воспроизведения каждого числа это число он отсчитывает с 1 до этого числа т.е если 4 то 1 2 3 4 при это по ходу уже этого счета каждое число он пытается перемножить со всеми читслами из которых он состоит т.е если это число 4 то будет так
причем сама четверка не учавствует в умножении странным образом т.е не будет действия 1*4 потому что условие сравнения такое
а не
при этом каждое полученное число будет проверяеться на равенство 4 и если хоть один раз оно было равно 4-ем то получается(если программа правильная) это составное число... От сюда вывод что этот код составными считает те которые можно получить из чисел из которых состоит это чисо путем уиножения Воооот может разберешься, а может наоборот запутаешься??? Кстати я не понял значение строчки
и
вот тот-же вариант без этих строчек
|
| Автор: Luck_brt 10.9.2007, 07:54 |
| Нее, большое спасибо!!! Немного понял, не на все 100% но я пока токо 1раз прочитал А на счет этих строк, то просто, Вам ли незнать программирование это как искуство, каждый сочиняет как может |
| Автор: amg 10.9.2007, 10:37 |
| Ну это то ясно. Как только находится пара $i и $j такая, что ($i*$j)==$value, то значит, число $value - составное, дальше перебирать $i и $j не имеет смысла, и переходим к следующему $value. Это экономит время счета (если вообще можно говорить об экономии при таком алгоритме). |
| Автор: apook 10.9.2007, 10:37 |
| Осторожно, здесь что-то не то! Простое число это то число которое имеет ровно два натуральных делителя единицу и саму себя (см. http://ru.wikipedia.org/wiki/Простое_число).... Я внес изменеия в предыдущий пост, добавил неразберихи, то что я обьяснял сперва это был поиск составных чисел, далее как сказал amg, меняем == на != и получаем поиск каких то других чисел(вродь получается что простых) Извини за путанницу |
| Автор: Luck_brt 11.9.2007, 05:55 |
| Теперь опять что то не так... Почему (1==$compasite) выдает составные а (1!=$compasite) выдает уже простые числа ??? я так понимаю что $compasite не равно 1-му то просто $count увеличеваеться и соответсвенно увеличиваеться счетчик найденых чисел. Но я так и непойму как $compasite обозначает что число являеться простым ? То что там перебираеться и переумножаеться, это тоже понятно. Но причем тут $compasite так и не понятно... |
| Автор: apook 11.9.2007, 06:45 | ||||||||||
Слухай сюда:
так как уже следующие вычисления уже лишние, те к примеру строки
эту проблему как раз и решали(я просто новичек в Perl сразу не вьехал) Далее идет проверка
Стало быть изначально код предназначен находить сосавные числа, [для справки составное число это число не являющееся простым, Каждое составное число является произведением двух натуральных чисел больших 1], так если мы меняем == на != получаяется что производится поиск не таких чисел и если составное число это число не являющееся простым то не такое число это то число являющееся простым. Вот тока исходя из этого походу! |
| Автор: varnie 27.9.2007, 07:00 | ||
забыл добавить, это решение официально расписано вhttp://ru.wikipedia.org/wiki/Perl |
| Автор: fantome 27.9.2007, 07:55 | ||
| varnie, но это решение не эффективно по памяти, как там сказано... Но красивое не спорю... +1 а если надо написать прогу, которая будет искать простые числа - то лучше сначала покопаться в алгоритмах... По крайней мере проверку на деление можно вести не до самого числа, а до корня квадратного из него... И много еще чего можно придумать... В свое время я на си реализовывал алгоритм генерации простых чисел для ЭЦП ГОСТ Р 34.10, пардон конечно за отступление от темы... строчка
перебрасывает выполнение на последнюю строку цикла... насколько мне известно... то есть перебор продолжится дальше для новых значений $i , но значение $compasite уже установили в 1... А его сброс в 0 идет перед первым циклом for. |