Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа по нахождению простых чисел... 
:(
    Опции темы
Luck_brt
Дата 7.9.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Доброго времени суток, вам.

Проблема такая,  начал недавно изучать язык Perl. И сталкнулся с проблемой. Есть код (был в мануале smile)) Вот, а мне надо его модифицировать, что бы он был правильным. И я никак не могу с этим справиться, вот решил обратиться за помощью к вам. Т.к. буду еще не раз писать, то создаю тему.
Заранее очень благодарин. Ниже код.

#!/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. (Но это сугубо мое мнение smile))

Это сообщение отредактировал(а) Luck_brt - 7.9.2007, 11:26
PM MAIL   Вверх
amg
Дата 7.9.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Да... 
Заменить 1==$compasite на 1!=$compasite, и будут печататься не составные, а простые числа.
PM MAIL   Вверх
Luck_brt
Дата 7.9.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Цитата(amg @ 7.9.2007,  12:01)
Да... 
Заменить 1==$compasite на 1!=$compasite, и будут печататься не составные, а простые числа.

Спасибо!!! Слушай пожалсто, если будет время напиши, как так ???? ))) Нифига не могу догнать, даже когда ответ вот он... (((
PM MAIL   Вверх
Luck_brt
Дата 10.9.2007, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Прошу Вас кому не тяжело, напишите, почему, так ???
PM MAIL   Вверх
apook
Дата 10.9.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: нет
Всего: 23



анализ кода показал что сей код делает следующее:
1. воспроизводит числа от 0 до 20-и но цифру 20 можно поменять хоть на какую
2. далее походу воспроизведения каждого числа это число он отсчитывает с 1 до этого числа т.е если 4 то 1 2 3 4  при это по ходу уже этого счета каждое число он пытается перемножить со всеми читслами из которых он состоит т.е если это число 4 то будет так
Цитата

1*1   1*2   1*3
2*1   2*2   2*3
3*1   3*2   3*3

причем сама четверка не учавствует в умножении странным образом  т.е не будет действия 1*4 потому что условие сравнения такое
Код

if( $i<$value ) 

а не
Код

if( $i<=$value ) 


при этом каждое полученное число будет проверяеться на равенство 4 и если хоть один раз оно было равно 4-ем то получается(если программа правильная) это составное число...

От сюда вывод что этот код составными считает те которые можно получить из чисел из которых состоит это чисо путем уиножения smile пример в числе 4 при его разложении есть числа 1 2 3 4 (саму четверку не берем) теперь можно увидеть что 4 можно получить  2*2 так что прога говорит что это число годится , теперь берем число 3 оно состоит из 1 2 3 три не берем и  ни 1*2 ни 2*1 не дает 3 и прога его не считает составным

Воооот может разберешься, а может наоборот запутаешься???

Кстати я не понял значение строчки
Код

OUTER:

и
Код

last OUTER;


вот тот-же вариант без этих строчек
Код

#!/usr/bin/perl -w

for( $count=0,$value=1; $count<20; $value++ )
{
    $compasite=0;

    for( $i=1; $i<$value; $i++ )
    {
        for( $j=1; $j<$value; $j++ )
        { 
            if( ($i*$j)==$value )
            {
                $compasite=1;
                }
            }
        }

    if( $compasite==1 )
    {
        $count++;
        print "$value ";
       }
    }




Это сообщение отредактировал(а) apook - 10.9.2007, 10:59


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Luck_brt
Дата 10.9.2007, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Нее, большое спасибо!!! Немного понял, не на все 100% но я пока токо 1раз прочитал smile Еще пару раз и ... Еще раз спасибо! было бы мне можно повышать репутацию , я бы с удовольствием повысел...
 А на счет этих строк, то просто, Вам ли незнать программирование это как искуство, каждый сочиняет как может smile

Это сообщение отредактировал(а) Luck_brt - 10.9.2007, 08:01
PM MAIL   Вверх
amg
Дата 10.9.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(apook @  10.9.2007,  07:40 Найти цитируемый пост)
Кстати я не понял значение строчки OUTER: и last OUTER;
Ну это то ясно. Как только находится пара $i и $j такая, что ($i*$j)==$value, то значит, число $value - составное, дальше перебирать $i и $j не имеет смысла, и переходим к следующему $value. Это экономит время счета (если вообще можно говорить об экономии при таком алгоритме).

PM MAIL   Вверх
apook
Дата 10.9.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: нет
Всего: 23



Осторожно, здесь что-то не то!

Простое число это то число которое имеет ровно два натуральных делителя единицу и саму себя (см. здесь)....

Я внес изменеия в предыдущий пост, добавил неразберихи, то что я обьяснял сперва это был поиск составных чисел, далее как сказал amg, меняем == на != и получаем поиск каких то других чисел(вродь получается что простых)

Извини за путанницу

Это сообщение отредактировал(а) apook - 10.9.2007, 11:02


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Luck_brt
Дата 11.9.2007, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Теперь опять что то не так... Почему (1==$compasite) выдает составные а (1!=$compasite) выдает уже простые числа ??? я так понимаю что $compasite не равно 1-му то просто $count увеличеваеться и соответсвенно увеличиваеться счетчик найденых чисел. Но я так и непойму как $compasite обозначает что число являеться простым ? То что там перебираеться и переумножаеться, это тоже понятно. Но причем тут $compasite так и не понятно...


Это сообщение отредактировал(а) Luck_brt - 11.9.2007, 05:59
PM MAIL   Вверх
apook
Дата 11.9.2007, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: нет
Всего: 23



Слухай сюда: 
Код
$compasite=1;
 делается тока тогда когда соблюдено условие 
Код
if( ($i*$j)==$value )
 а это условие означает что число составное так? так... по хорошему надо в этот момент выпрыгивать из циклов
Код

    for( $i=1; $i<$value; $i++ )
    {
        for( $j=1; $j<$value; $j++ )
        { 
            if( ($i*$j)==$value )
            {
                $compasite=1; #запомнили что это число составное
                }
            }
        }

так как уже следующие вычисления уже лишние, те к примеру строки
Код

OUTER:
и
last OUTER;

эту проблему как раз и решали(я просто новичек в Perl сразу не вьехал)
Далее идет проверка
Код

    if( $compasite==1 ) #если true то печатаем и увеличиваем счетчик
    {
        $count++;
        print "$value ";
       }

Стало быть изначально код предназначен находить сосавные числа, [для справки составное число это число не являющееся простым, Каждое составное число является произведением двух натуральных чисел больших 1], так если мы меняем == на != получаяется что производится поиск не таких чисел и если составное число это число не являющееся простым то не такое число это 
то число являющееся простым. Вот тока исходя из этого походу!


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
varnie
Дата 27.9.2007, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: нет
Всего: 0



Код

perl -wle '(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_'


забыл добавить, это решение официально расписано в википедии о perl

Это сообщение отредактировал(а) varnie - 27.9.2007, 07:04
PM MAIL   Вверх
fantome
Дата 27.9.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 5.2.2007

Репутация: нет
Всего: 1



varnie
но это решение не эффективно по памяти, как там сказано... Но красивое не спорю... +1

а если надо написать прогу, которая будет искать простые числа - то лучше сначала покопаться в алгоритмах...

По крайней мере проверку на деление можно вести не до самого числа, а до корня квадратного из него... И много еще чего можно придумать... В свое время я на си реализовывал алгоритм генерации простых чисел для ЭЦП ГОСТ Р 34.10, пардон конечно за отступление от темы...

строчка
Код

last OUTER;

перебрасывает выполнение на последнюю строку цикла... насколько мне известно... то есть перебор продолжится дальше для новых значений $i , но значение $compasite уже установили в 1... А его сброс в 0 идет перед первым циклом for.


Это сообщение отредактировал(а) fantome - 27.9.2007, 07:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.