Задача 1. Получив на вход число х, программа печатает два числа - а и b. Укажите наибольшее из таких чисел х, при вводе которых программа напечатает сначала число 3, а потом число 35.
var x, a, b: integer;
begin
readln(x);
a:=0;
b:=l;
while x>0 do begin
a := a+1;
b := b*(x mod 10);
X := X div 10;
end;
writeln(a);
write(b);
end.
Решение
В данном случае трассировка бессмысленна, так как исходное данное неизвестно (его и нужно определить). Поэтому решение заключается в общем анализе алгоритма.
1. Программа должна первым напечатать значение 3. Поскольку первым стоит оператор вывода writeln(a), по завершении выполнения цикла переменная a должна быть равна 3. Изначально a = 0. Изменение этой переменной в цикле производится оператором a := a+1, т.е. значение a определяет количество проходов цикла.
2. Таким образом, цикл выполняется 3 раза. При этом второе печатаемое число (значение переменной b) равно 35.
Анализируем цикл целиком:
while x>0 do begin
a := a+1;
b := b*(x mod 10);
X := X div 10;
end;
Конструкция, включающая в себя сначала вычисление остатка от деления числа x на 10, а затем меняющая значение x на результат целочисленного деления x на 10, в цикле пока x > 0, является типовой и реализует последовательное выделение цифр числа x.
Таким образом, данный цикл выполняет поочередное (справа налево - от младших разрядов к старшим) выделение цифр числа x и вычисление в переменной b произведения этих цифр.
3. Итак, нам нужно найти наибольшее значение числа x, у которого произведение цифр равно 35, а количество цифр равно трем (так как цикл выделения каждой цифры выполнялся трижды).
Число 35 можно разложить на множители как 5 · 7, причем эти множители простые. Чтобы получить три множителя, можно добавить к ним единицу: 35 = 5 · 7 · 1.
Таким образом, для получения заданных результатов (чисел 3 и 35) нам годятся значения x, равные всем возможным комбинациям цифр 1, 5 и 7. Наибольшее же из таких чисел равно, очевидно, 751.