В программе будут перебираться в цикле все числа, указанные в командной строке. Очередное число будет выводиться вместе с последующим двоеточием:
Perlfor my $n(@ARGV) { print "$n:"; ❶ вывести простые делители числа $n, разделяя их пробелами print "\n"; }
Теперь займёмся содержательной частью программы, помеченной значком ❶.
Самый наивный подход — пытаться делить число $n
на всевозможные числа $k
, начиная с 2
и
не превосходящие $n
. Если делится нацело, то
$k
является делителем числа $n
, и его
нужно напечатать, вставив перед ним пробел. После этого $n
нужно уменьшить в $k
раз. Если же при делении появляется
ненулевой остаток, следует перейти к следующему $k
. Этот
алгоритм будет находить только простые делители, так как перебор возможных
делителей осуществляется в порядке их возрастания.
Perlmy $k=2; while($k<=$n) { if($n % $k==0) { print " $k"; $n/=$k; } else { $k++; } }
Можно немного улучшить нашу программу, заметив, что среди простых чисел чётным
является только . Поэтому попытки
делить на чётные $k
, бо́льшие , обречены на провал. Заменив оператор
Perl$k++;
на код
Perlif($k==2) { $k=3; } else { $k+=2; }
мы сократим перебор делителей примерно в два раза. Последнюю конструкцию можно заменить на гораздо более компактный (но хуже читаемый) эквивалент:
Perl$k+=($k==2)? 1: 2;