Автор | Сообщение |
|
Отправлено: 27.04.21 15:50. Заголовок: Задание 17 №77 (А.Г. Минак)
Написал программу для решения этого задания. Количество чисел совпадает с ответом, а число, наиболее близкое к среднему арифметическому значению этих чисел - нет. Прилагаю свое решение: Const a = 2020; b = 647038; Var n, kNum : integer; AvNum, Min, nMin : real; function NumWork(n : integer) : boolean; var digits : array [1..6] of byte; c, k, SumD, minD : integer; begin NumWork := False; SumD := 0; MinD := 10; k := 0; While n > 0 do begin inc(k); c := n mod 10; digits[k] := c; SumD := SumD + c; if c < minD then minD := c; n := n div 10; end; if (SumD < 10) and (minD <> digits[k]) and (minD <> digits[k-1]) and (minD <> digits[k-2]) then NumWork := True; end; //основная программа Begin kNum := 0; for n := a to b do begin if NumWork(n) then begin //writeln(n); inc(kNum); AvNum := AvNum + n; end; end; AvNum := AvNum / kNum; //Writeln(AvNum); Write(kNum,' '); min := abs(AvNum - a); nMin := a; for n := a + 1 to b do if abs(AvNum-n) < min then begin min := abs(AvNum - n); nMin := n; end; Writeln(nMin); End. Буду признателен, если укажите на ошибку в программе или поясните, что значит *число, наиболее близкое к среднему арифметическому значению этих чисел* чисел
|
|
|
Новых ответов нет
[см. все]
|
|
|
Отправлено: 28.04.21 15:52. Заголовок: Ответ
Наиболее близкое имеет минимальный модуль разности со средним арифметическим. def f(x): lst_ = [int(a) for a in str(x)] sum_ = sum(lst_) min_ = min(lst_) return sum_ < 10 and min_ not in lst_[:3] k = s = 0 for i in range(2020, 647_039): if f(i): k += 1 s += i sr = s / k k = b = 0 m = float('inf') for i in range(2020, 647_039): if f(i): k += 1 if abs(sr - i) <= m: m = abs(sr - i) b = i print(k, b)
|
|
|
|
Отправлено: 28.04.21 16:59. Заголовок: Ошибка найдена
Спасибо за ответ. Разобрался. Моя ошибка заключалась в том, что я искал наиболее близкое к среднему арифметическому из ВСЕХ чисел диапазона, а нужно было искать среди тех, которые должны удовлетворять условию. Добавил в код проверку числа и ответ сошелся. for n := a + 1 to b do if NumWork(n) and (abs(AvNum-n) < min) then begin min := abs(AvNum - n); nMin := n; end; Writeln('Наиболее близкое по модулю = ',nMin);
|
|
|
|