Другие языки программирования и технологии

PascalABC задачка из ЕГЭ

Ниже записан алгоритм. Сколько существует таких чисел x, при вводе которых алгоритм печатает сначала 2, а потом 12?
var x, a, b: integer;
begin
readln(x);
a := 0; b := 0;
while x>0 do begin
a := a + 1;
b := b + (x mod 100);
x := x div 100
end;
writeln(a); write(b)
end.

Можно пожалуйста подробное решение, я пытался сделать, но у меня получается 7, а верно 12. Не могу понять почему
Попытаюсь объяснить. Первые ограничения у нас здесь это вот эти строки:
> a := a + 1;
> x := x div 100
Они позволяют отбросить довольно много чисел сразу. Почему? Потому что условие у нас такое: "a" должно быть 2, а "b" - 12.
"a" равно двум только в случае прохода цикла 2 раза. "x" у нас должен быть больше 100 и меньше 10000, т. к. иначе цикл либо пройдёт 1 раз, либо более 2-х раз. Т. е. уже у нас варианты остаются от 100 до 9999.
Теперь про "b". Здесь немного запутаннее.
Чтобы получить в итоге в "b" число 12 нам нужно чтобы при первой итерации цикла было такое число, чтобы при сложении этого числа с числом при второй итерации цикла получилось 12. mod - деление с остатком, div - целочисленное деление.
Например, число 507 нам должно подойти, проверяем:
1) b= 0 + (507 mod 100) = 0 + 7
x= 507 div 100 = 5
2) b= 7 + (5 mod 100) = 5 + 7 = 12
Как проще посчитать? Визуально отделяем десятки и единицы от сотен и тысяч. Например, число 1234. Всё, что нам нужно сделать, это отделить 12 от 34 и сложить. Вот и всё. Число 1234 нам не подходит (можете сами проверить), т. к. получается 12+34=46. А вот число 1200 - подходит, как и число 507.
Для проверки возьмём ещё число 1152:
1) b= 0 + (1152 mod 100) = 0 + 52 = 52
x= 1152 div 100 = 11
2) b= 52 + (11 mod 100) = 52 + 11 = 63
Как итог - число не подходит.
Вот числа, которые подходят: 111, 210, 309, 408, 507, 606, 705, 804, 903, 1002, 1101, 1200. Закономерность видна я думаю.
**я Твой Кислород** Sultanbekov
4 198
Лучший ответ