Series25. Дано целое число $$N$$ и набор из $$N$$ целых чисел, содержащий по крайней мере два нуля. Вывести сумму чисел из данного набора, расположенных между первым и последним нулем (если первый и последний нули идут подряд, то вывести 0).
Решение:
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 |
program Series25; var i,N,Num,Sum,SumTemp :Integer; b:boolean; begin Write('N:'); Readln(N); SumTemp:=0; b:=False; for i:=1 to N do begin write('Введите ',i,' элемент набора :'); Readln(Num); SumTemp:=SumTemp+Num; if Num=0 then begin if not b then begin SumTemp:=0; b:=True; end; Sum:=SumTemp; end; end; Writeln(Sum); end. |
Другие задачи из раздела Series можно посмотреть здесь.
Было:
Стало:
Кажется, у вас небольшая опечатка в решении. Я считаю что на 22 строке должно быть Sum:=Sum+SumTemp; а не Sum:=SumTemp;
Нет всё ок.
В переменной Sum я сохраняю возможный парвильный ответ. А сумма щитаетс в SumTemp.
Сейчас попытаюсь описать алгоритм.
SumTemp — храниться сумма от первого нуля.
делается это следующим образом
при вводе каждого нового элемента мы к прибавляем его к SumTemp SumTemp:=SumTemp+Num;
Если встречаем 0
if Num=0 then
определяем первый ли он?
if not b then
если он первый b будет равнятся false
Тогда зануляем SumTemp и b назначаем true
begin
SumTemp:=0;
b:=True;
end;
Ну и каждый раз когда мы видим ноль мы сохраняем текущую SumTemp в Sum. Вдруг это последний ноль.
Sum:=SumTemp;
Когда мы вышли из цикла, показываем Sum там будет сумма элементов от первого нуля до последнего.
Тоесть если заменить 20 строчку на Sum:=Sum+SumTemp; то мы получим … как бы это словами 🙂 мы будем складывать суммы элементов от первого нуля до текущего.
почти так же сделал только ифы не вкладывал друг в друга