<?php
/* Наибольший нетривиальный делитель натурального
числа --- это наибольшее натуральное число на которое
делится рассматриваемой нами число . Естественно , что
любое натруальное число делится само на себя и на единицу
нацело . Именно эти два числа --- само число и единица ---
являются тривиальными делителями, и их мы не рассматриваем.
Будем рассуждать следующим образом :
1) Рассматриваемое нами число может иметь один , два
и более натуральных делителя , на которых оно делится без
остатка . Значит, мы должны придумать условие , которое бы
отражало суть нашего деления. То есть получается , что при
делении на любой нетривиальный делитель у нас число делится
нацело без остатка . То есть явно использовать $a % $i == 0
Наше число $a делим на $i и возвращаем остаток
(остаток от деления получается матемтической операцией % ),
который должен равняться нулю. Мы должны перебрать все возможные
делители $i , которые делятся без остатка на наше число $a .
И выбрать наибольший .
*/
// Записываем наше число
$a=20;
// Первое число берем два , один и ноль не подходят. На ноль делить
//нельзя , а единица -это тривиальный делитель.
$i=2;
// Теперь пишем цикл . Мы должны перебрать все делители от 2 и далее
// которые делятся без остатка .
echo "Это результат первого кода : ","<BR>";
while (($a % $i ) == 0 )
{
echo $i , "<BR>";
$i++;
}
echo "А теперь другой код : ","<BR>";
// Отлично ! Программа работает , но здесь есть недочёт
// программа работает пока условие (($a % $i ) == 0) истинно,
// то есть, если число $a=26 , а $i=2 , то всё отлично делится
// без остатка , условие выполнилось то есть условие возвращает нам
// TRUE и цикл прекратился уже при $i=3 ,так как уже будет остаток,
// равный 2 .
// Всё хорошо , но задачу мы не решили . Мы должны найти
// наибольший делитель . Как исправить код ?
// Вот решение :
// Создадим массив ( он необходим для записи всех делителей):
$array=array();
// создадим массив в цикле while. А здесь запишем чему равен начальный элемент:
$e=0;
// И создадим массив с неизвестным количеством элементов
$array=array();
// Начинаем работу программы:
for ($k=0 ; $k<$a ;$k++)
{
while ( (($a % $i ) == 0 ))
// Мы должны сделать так чтобы количество
// элементов массива равнялось количеству индексов
//массива :
{
//Заполним массив делителей , их количество заранее
// неизвестно:
$array[$e].$i;
//увеличиваемномер элемента массива на единичку
$e++;
// Выводим значение переменных $i и $k (вывод $k нужен
// для понимания работы цикла)
echo "Chislo i:", $i ," Chislo k:",$k, "<BR>";
// Если оператор break убрать , то цикл будет выполнятся
//бесконечно . Почему ?
// Ответ : пока условие цикла while истинно , то тело цикла
// будет выполнятся бесконечно
// а это потому , что переменная $i здесь неизменна , а
// меняется вне цикла while
break;
}
$i++;
}
// Всегда нетривиальный делитель по порядку на единичку меньше ,
//чем само число (которое является тривиальным делителем) , как
//последнее в порядке всех делителей .
// Другими словами наибольший нетривиальный делитель
// по порядку записи в массиве стоит предпоследним , то есть
// ключ массива равен $e-1 :
echo $array[$e-1] , " Naibolshii netrivialnii delitel" ,"<BR>";
?>
vedro-compota
Tue, 09/08/2015 - 22:10
Permalink
сверх нормы)
задача плюсом отмечена в списке не была - но раз взялись, то решайте её. Это полезно.
Создайте отдельную заметку "нетривиальный делитель" в этом разделе (где и объясните что это такое и затем уже сошлитесь "отсюда туда")
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/09/2015 - 11:02
Permalink
ну так
прежде всего необходимо иное условие завершения перебора делителей, в данный момент вы решили задачу поиска 1-ого нетревиального делителя (а не последнего, который и нужен).
_____________
матфак вгу и остальная классика =)
math2
Wed, 09/16/2015 - 13:46
Permalink
На самом деле задача поиска
На самом деле задача поиска наименьшего нетривиального делителя не решена.
Если \$a не делится на 2, то тело цикла while не будет выполнено ни разу.
Произведение наименьшего нетривиального делителя числа \$a и наибольшего нетривиального делителя числа \$a равно числу \$a.
Можно исправить код, изменив условие цикла.
vedro-compota
Thu, 09/17/2015 - 11:54
Permalink
верно
_____________
матфак вгу и остальная классика =)
math2
Thu, 09/17/2015 - 14:57
Permalink
OK. Знаки доллара поставил.
OK. Знаки доллара поставил.
vedro-compota
Thu, 09/17/2015 - 17:23
Permalink
спасибо)
спасибо)
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/09/2015 - 11:10
Permalink
счётчик цикла не изменяется
несогласованные условия. такой цикл никогда не закончится. почему?
_____________
матфак вгу и остальная классика =)
fgh
Wed, 09/09/2015 - 21:41
Permalink
Да , так как $k всегда меньше
Да , так как \$k всегда меньше \$a , а подкручивается только счётчик \$i.
vedro-compota
Thu, 09/10/2015 - 08:46
Permalink
for
Что делает цикл:
?? Объясните пожалуйста.
_____________
матфак вгу и остальная классика =)
fgh
Thu, 09/10/2015 - 14:03
Permalink
Данный цикл , осуществляет
Данный цикл , осуществляет запуск по новой вложенного цикла while , задача цикла
увеличи вать значение :
и запуск цикла while при другом значении:
vedro-compota
Thu, 09/10/2015 - 15:01
Permalink
увеличи вать значение :
это бессмыссленный ответ. Я и сам вижу код.
Скажите мне - какой смысл имеет цикл относительно построения алгоритма?
В том-то и проблема, что в данный момент эта конструкции просто "запускает" внутрениий сколько-то раз. но зачем?
_____________
матфак вгу и остальная классика =)
math2
Wed, 09/16/2015 - 22:53
Permalink
Интересно, что цикл while
Интересно, что цикл while здесь функционирует как условный оператор if.
vedro-compota
Thu, 09/17/2015 - 11:52
Permalink
угу
а потому он конструктивно избыточен - тут при любом стиле достаточно одного цикла, судя по всему.
Вложенность вообще не нужна.
_____________
матфак вгу и остальная классика =)
vedro-compota
Thu, 09/10/2015 - 15:06
Permalink
на самом деле решение вашей
на самом деле решение вашей задачи начинается с этой (в некотором смысле) - относительно перебора делителей.
В данный момент вы "разогнали" и комментарии до изрядного размера, но при этом в Вашем рассуждении отсутствуют комментарии к структурам двух циклов:
for ($k=0 ; $k {
while ( (($a % $i ) == 0 ))
- вы должны чётко формулировать (и осозновать!) - для чего вы создаёте очередной цикл.
_____________
матфак вгу и остальная классика =)
math2
Wed, 09/16/2015 - 22:26
Permalink
Кстати, из второй части
Кстати, из второй части приведённого решения можно сделать программу
для разложения натуральных чисел на простые множители.
fgh
Fri, 09/18/2015 - 08:30
Permalink
Ух ты интересно...спасибо )))
Ух ты интересно...спасибо ))) сейчас изучаю как реализовывался массив с
А задачу надо мне дорешать с нового листа : решение с чистого листа