Даны два натуральных числа a и b. Найдите наибольшее значение отношения трехзначного числа из
отрезка [a,b] к сумме его цифр. Нужно написать компьютерную программу.Прошу лишь только прояснить простым языком, что нужно делать? Я совсем не понимаю, что от меня хотят:(Ответы на вопрос
Объявить А и В. Произвести их ввод, если требуется.
Объявить переменную, которая будет показывать максимальное отношение, например 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]. Каждое число делим на сумму его цифр и из результатов деления оставляем наибольшее значение. Это так называемый однопроходный алгоритм, когда результат можно получить, обратившись к каждому значению один раз.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili
