ВВЕРХ
ВНИЗ
  • Home
  • Series
  • Series 24 - 25

Сумма чисел между двумя нулями

Series24. Дано целое число N и набор из N целых чисел, содержащий по крайней мере два нуля. Вывести сумму чисел из данного набора, расположенных между последними двумя нулями (если последние нули идут подряд, то вывести 0).

Здесь предполагается, что вводимая последовательность уже содержит как минимум 2 нуля. То есть ни какой предварительной проверки на наличие нулей не осуществляется.

Будем здесь искать сумму чисел memory между нулями (это будет временная сумма). Краткий смысл действий таков: как только мы ввели первый нуль, со следующего (ненулевого) ввода начинаем считать сумму вводимых чисел. После ввода второго нуля записываем вычисленную сумму, а временную суму memory обнуляем. Со следующего ненулевого числа снова начинаем вычислять сумму до последующего ввода нуля, и т.д.

Краткая последовательность действий по пунктам:

1) Итак, сначала мы вводим целое N (количество элементов), и полагаем memory := 0 (начальная сумма), IsZero := false (нулей в последовательности нет).

2) Заходим в цикл по N и вводим новое число b.

3) Проверяем условие (b=0) - мы ввели нулевое число; если оно выполняется, то:

  • 3.1) Проверяем условие (IsZero=false), или (not IsZero), означающее, что до этого мы не встречали нулей. Если да, то полалаем IsZero:=true (мы встретили первый нуль).
  • 3.2) Иначе, если 3.1 не выполняется, то есть IsZero=true (число b=0 - это уже не первый нуль), то запоминаем вычисленную сумму: S:=memory, а саму временную сумму обнуляем: memory:=0. Итак, в предыдущем пункте, как только мы встречаем первый нуль, со следующего ввода числа b мы начинаем вычислять сумму memory (см. пункт 4). И так до того момента, пока не встретим следующий нуль.

4) Если условие 3 не выполняется (b<>0), то вычисляем вспомогательную сумму memory только в том случае, если мы уже встречали нуль (IsZero=true). Пока мы не встретим первый нуль сумма вычисляться не будет.

5) После выхода из цикла выводим сумму S. В цикле эта сумма будет изменяться каждый раз, как мы будем встречать нуль.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
var
  b, N, S, memory: integer;
  i: byte;
  IsZero: boolean;

begin
  write('N = ');
  readln(N);
  memory := 0; { <== Временное значение суммы }
  IsZero := false; { <== Нулей ещё нет }
  writeln('Введите последовательность ', N, ' целых чисел:');
  for i := 1 to N do begin
    read(b); { <-- Вводим целое число }
    if b = 0 then { <-- введенное число b = 0 }
      if not IsZero then { <-- Если нулей ещё не было }
        IsZero := true { <-- то меняем индикатор }
      else begin { <-- В противном случае: }
        S := memory; { <-- запоминаем сумму }
        memory := 0 { <-- обнуляем временную сумму }
      end
    else { <-- введенное число b ≠ 0 }
      if IsZero then { <-- Если нули уже встречались }
        memory := memory + b { <-- то увеличиваем временную сумму }
  end;
  writeln('Сумма чисел между последними двумя нулями: ', S);
  readln
end.

Series25. Дано целое число N и набор из N целых чисел, содержащий по крайней мере два нуля. Вывести сумму чисел из данного набора, расположенных между первым и последним нулем (если первый и последний нули идут подряд, то вывести 0).

Как и в предыдущем примере, последовательность должна содержать как минимум два нуля.

Здесь действия будут те же, кроме двух отличий. Во-первых, в начале, кроме вспомогательной суммы memory, нужно также инициализировать общую сумму: S:=0. Во-вторых, как только в цикле находим каждый последующий нуль, сумме S не присваиваем временное memory, а увеличиваем её на memory, так как нас интересует вся сумма чисел от первого до последнего нуля, а не только сумма чисел между двумя последними нулями. Всё остальное не меняется.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  b, N, S, memory: integer;
  i: byte;
  IsZero: boolean;

begin
  write('N = ');
  readln(N);
  S := 0; { <== Общее значение суммы }
  memory := 0; { <== Сумма чисел между соседними нулями }
  IsZero := false; { <== Нулей ещё нет }
  writeln('Введите последовательность ', N, ' целых чисел:');
  for i := 1 to N do begin
    read(b); { <-- Вводим с клавиатуры целое число }
    if b = 0 then { <-- введенное число 0 }
      if not IsZero then { <-- Если нулей раньше не было }
        IsZero := true { <== то меняем индикатор: найден первый нуль }
      else begin { <-- Если нули раньше уже были }
        S := S + memory; { <== то увеличиваем общую сумму }
        memory := 0 { <== и обнуляем временную сумму }
      end
    else { <-- число b ненулевое }
      if IsZero then { <-- Если нули уже встречались }
        memory := memory + b { <== увеличиваем временную сумму }
  end;
  writeln;
  writeln('Сумма чисел между первым и последним нулями: ', S);
  readln
end.


Яндекс.Метрика