Помогите, пожалуйста!) Дан массив, содержащий 2016 положительных целых чисел, не превышающих 1000. Необходимо найти и вывести максимальный из тех элементов этого массива, восьмеричная запись которых содержит не менее четырёх цифр и оканчивается цифрой 4. Если таких чисел в массиве нет, ответ считается равным нулю. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из описанных.Const N=2016; var a: array [1..N] of integer; i, m, k: integer; begin for i:=1 to N do readln(a[i]); … end. В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии.

Вопрос школьника по предмету Информатика

Помогите, пожалуйста!)
Дан массив, содержащий 2016 положительных целых чисел, не превышающих 1000. Необходимо найти и вывести максимальный из тех элементов этого массива, восьмеричная запись которых содержит не менее четырёх цифр и оканчивается цифрой 4. Если таких чисел в массиве нет, ответ считается равным нулю. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из описанных.
Const
N=2016;
var
a: array [1..N] of integer;
i, m, k: integer;
begin
for i:=1 to N do
readln(a[i]);

end.
В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. В этом случае Вы должны
использовать те же самые исходные данные и переменные, какие были предложены в условии.

Ответ учителя по предмету Информатика

Const

  N=2016;

var

  a: array [1..N] of integer;

  i, m, k: integer;

begin

  for i:=1 to N do

    readln(a[i]);

  k:=0;

  for i:=1 to N do begin

    m:=a[i]-516;

    if m>=0 then begin

      if m mod 8=0 then begin

        m:=m div 8;

        if (m — m mod 8) mod 8 = 0 then

          if a[i]>k then k:=a[i]

        end

      end

    end;

  Writeln(k)

end.

Объяснения

Число 1000₁₀ = 1750₈, а минимальное четырехзначное восьмеричное число — это 1000₈ = 512₁₀.

Следовательно, искомые числа лежат на интервале [512;1000] и всегда содержат 1 в старшем разряде своего восьмеричного представления.

Вычтем из исходного числа 512 и тогда можно рассматривать только трехзначные восьмеричные числа.

Трехзначное восьмеричное число в расширенной записи имеет вид

N=abc₈ = (a×8²+b×8¹+c)₁₀ = 64a+8b+c.

По условию с=4, поскольку число должно оканчиваться на 4 в своем восьмеричном представлении.

Мы получили соотношение N-4 = 64a+8b = 8(8a+b), т.е. N-4 должно быть кратно 8. Итак, первый шаг — получить a[i]-516 и если оно не отрицательно, проверить нулевой остаток от деления этой величины на 8. Если это так, полагаем m=(a[i]-4) div 8.

Рассматриваем уравнение m=8a+b. a=(m-b)/8. Понятно, что m-b>0 и a должно быть кратно 8. Что и следует проверить. Если все так и есть — число подходит и следует обычная проверка алгоритма поиска максимума.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Похожие вопросы от пользователей