Даны два натуральных числа a и b. Найдите наибольшее значение отношения трехзначного числа из отрезка [a,b] к сумме его цифр.
Нужно написать компьютерную программу.
Прошу лишь только прояснить простым языком, что нужно делать? Я совсем не понимаю, что от меня хотят:(
Answers & Comments
Объявить А и В. Произвести их ввод, если требуется.
Объявить переменную, которая будет показывать максимальное отношение, например MaxRatio, приравнять её к нулю.
Циклом перебрать все трехзначные числа на отрезке [A,B]. В цикле ввести условный оператор, если отношение текущего проверяемого числа к сумме его цифр больше, чем MaxRatio, то приравнять MaxRatio к текущему числу.
Вызвать исключение, если меж числами А и В нет положительных трехзначных чисел.
Могу составить на С++ или C#, если нужно.
===== 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]. Каждое число делим на сумму его цифр и из результатов деления оставляем наибольшее значение. Это так называемый однопроходный алгоритм, когда результат можно получить, обратившись к каждому значению один раз.