Идеи реализации

В программе будут перебираться в цикле все числа, указанные в командной строке. Очередное число будет выводиться вместе с последующим двоеточием:

for my $n(@ARGV)
{
	print "$n:";

	❶ вывести простые делители числа $n, разделяя их пробелами

	print "\n";
}

Теперь займёмся содержательной частью программы, помеченной значком .

Самый наивный подход — пытаться делить число $n на всевозможные числа $k, начиная с 2 и не превосходящие $n. Если делится нацело, то $k является делителем числа $n, и его нужно напечатать, вставив перед ним пробел. После этого $n нужно уменьшить в $k раз. Если же при делении появляется ненулевой остаток, следует перейти к следующему $k. Этот алгоритм будет находить только простые делители, так как перебор возможных делителей осуществляется в порядке их возрастания.

Perl
my $k=2; while($k<=$n) { if($n % $k==0) { print " $k"; $n/=$k; } else { $k++; } }

Можно немного улучшить нашу программу, заметив, что среди простых чисел чётным является только 2. Поэтому попытки делить на чётные $k, бо́льшие 2, обречены на провал. Заменив оператор

Perl
$k++;

на код

Perl
if($k==2) { $k=3; } else { $k+=2; }

мы сократим перебор делителей примерно в два раза. Последнюю конструкцию можно заменить на гораздо более компактный (но хуже читаемый) эквивалент:

Perl
$k+=($k==2)? 1: 2;

Информатика-54© А. Н. Швец