===== PascalABC.NET =====
1. Решение, максимально близкое к "школьному"
begin
var (a, b) := ReadInteger2;
if a > b then // обеспечим b > a
Swap(a, b);
if (a > 999) or (b < 100) then // трехзначных чисел нет
Write('Интервал [', a, ',', b, '] не содержит трехзначных чисел')
else
begin
if a < 100 then // обеспечим a >= 100
a := 100;
if b > 999 then // обеспечим и b <= 999
b := 999;
// теперь у нас гарантировано только трехзначные числа
var k := 0.0; // тут будем запоминать максимальное отношение
for var n := a to b do // организуем перебор чисел в цикле
begin
// вначале найдем m - сумму цифр числа
var (m, p) := (0, n);
while p > 0 do
begin
m += p mod 10;
p := p div 10
end;
// найдем отношение n/m и если оно больше k, запишем в k
if n / m > k then
k := n / m;
end;
Print(k) // выведем результат
end
end.
2. Современное, более короткое решение
function Ratio(n: integer): real;
begin
var (t,s) := (n, 0);
while t > 0 do
begin
s += t mod 10;
t := t div 10
end;
Result := n / s
end;
begin
var (a, b) := ReadInteger2;
if a > b then // обеспечим b > a
Swap(a, b);
if (a > 999) or (b < 100) then // трехзначных чисел нет
Write('Интервал [', a, ',', b, '] не содержит трехзначных чисел')
else
begin
a := a.ClampBottom(100);
b := b.ClampTop(999);
// теперь у нас гарантировано только трехзначные числа
Range(a,b).Select(t -> Ratio(t)).Max.Print
end
end.
Объяснение:
Задаем конкретные значения a и b, затем перебираем все трехзначные числа, попавшие в интервал [a,b]. Каждое число делим на сумму его цифр и из результатов деления оставляем наибольшее значение. Это так называемый однопроходный алгоритм, когда результат можно получить, обратившись к каждому значению один раз.