Даны два натуральных числа a и b. Найдите наибольшее значение отношения трехзначного числа из отрезка [a,b] к сумме его цифр.

Нужно написать компьютерную программу.
Прошу лишь только прояснить простым языком, что нужно делать? Я совсем не понимаю, что от меня хотят:(​

Ответы

Ответ дал: 65biso2
0

Объявить А и В. Произвести их ввод, если требуется.

Объявить переменную, которая будет показывать максимальное отношение, например MaxRatio, приравнять её к нулю.

Циклом перебрать все трехзначные числа на отрезке [A,B]. В цикле ввести условный оператор, если отношение текущего проверяемого числа к сумме его цифр больше, чем MaxRatio, то приравнять MaxRatio к текущему числу.

Вызвать исключение, если меж числами А и В нет положительных трехзначных чисел.

Могу составить на С++ или C#, если нужно.

Ответ дал: BobbyFresnel
0

===== 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]. Каждое число делим на сумму его цифр и из результатов деления оставляем наибольшее значение. Это так называемый однопроходный алгоритм, когда результат можно получить, обратившись к каждому значению один раз.

Вас заинтересует