Просмотр задания
Укажите наименьшее из таких чисел x,
при вводе которых алгоритм печатает сначала 3, а потом 18.

program B20;
var x, a, b: integer;
begin
readln(x);
a := 0; b := 0;
while x > 0 do
begin
a := a + 1;
if x mod 2 = 0 then
b := b+ x mod 10;
x := x div 10;
end;
writeln(a); write(b);
end.
16 февраля 2016
Ответы (3)
Информатик БУ # 16 февраля 2016 в 13:03 +1
Для решения нужно определить, как работает алгоритм, проще говоря, что вообще делает эта программа.
В программу вводится значение x, программа выводит a и b. Значит значения a и b как-то связаны с переменной x. Определим, что такое a для икса, и что такое b.

Каждый повтор цикла while переменная a увеличивается на 1. При этом по условию a=3, значит цикл совершил три повтора.
Цикл выполняется, пока x>0, при этом каждый повтор цикла происходит операция x := x div 10, то есть от икса отнимается последний разряд. Например, если введём число
5555
то после 1го повтора оно примет вид
555
затем
55
дальше
5
и в конце концов
0

Исходя из этого можно утверждать, что a - количество разрядов в числе x, значит число x - трёхзначное.

Теперь разберемся с переменной b. Каждый повтор цикла к ней прибавляется последний разряд числа (x mod 10), значит b - сумма разрядов числа x, которая равна 18.

То есть мы должны найти наименьшее трёхзначное число, сумма разрядов которого равна 18. Для этого старшие разряды должны быть как можно меньше. Немного подумав, получаем число 189.
Число трёхзначное, сумма разрядов равна 18, оно наименьшее, т.к. старшие разряды наименьшие.
As No # 16 февраля 2016 в 13:22 0
Влияют ли изначальные значения a/b на ответ, допустим если b=1?
Информатик БУ # 16 февраля 2016 в 13:26 0
Конечно. Если b=1, то сумма разрядов числа должна быть равна 1, то есть подойдёт число 100, оно трёхзначное, сумма разрядов равна 1.
Перевести число из в Результат: 510 = 1012