nextupprevious

Next:5.3.2 Поиск в упорядоченном векторе
Up:5.3 Программы обработки векторов
Previous:5.3 Программы обработки векторов


5.3.1 Векторная функция

Задача. По заданному вектору целых чисел $(a_1,\ldots,a_{200})$ построить вектор $(b_1,\ldots,b_{200})$, в котором элемент $b_i$ равен количеству нечетных элементов среди $a_i, a_{i+1},\ldots, a_{200}$.

Решение. Обозначим через Нечетных$(i,j)$ для $1 \leq i \leq j \leq 200$ количество нечетных элементов среди $a_i, a_{i+1},\ldots,a_j$. Тогда наша цель состоит в построении Нечетных$(i,200)$ для всех $i = 1,\ldots, 200$. Для функции Нечетных имеем, очевидно

Этим определениям следует наше первое решение

module ВекторФункция;
    const M = 200;
    var I,J : integer; A,B : array M+1 of integer;
begin
    for I := 1 to M do read(A[I]);
        for I := 1 to M do
             B[I] := 0; (* {B[I] = Нечетных(I, I-1)} *)
              for J := I to M-1 do
                  (* {B[I] = Нечетных(I, I-1)} *)
                   B [I] := B[I] + A [J] mod 2 (* {B[I] = Нечетных(I, J)} *)
              end
        end;
    (* *)
    end
    for I := 1 to M do write(B[I]) end
end ВекторФункция.

Для построения другого, более эффективного решения заметим, что

Отсюда сразу следует второе решение нашей задачи, в котором мы строим элемент $b_i$ после построения элемента  в соответствии с приведенным определением для Нечетных(i, 200).

module ВекторФункция2;
    const M = 200;
    var I: integer; A: array M of integer; B:array M+2 of integer;
begin
    for I := 1 to M do read(A[I]) end; B[M+1] := 0;
    { B[M+1]= Нечетных(M+1,M )}
    for I := M to 1 by -1 do
        (* *)
        B[I] := B [I+1] + A [I] mod 2; (* { B[I]=Нечетных(I, M )} *)
    end;
    (* *)
    for I := 1 to M do write(B[I]) end
end ВекторФункция2.

Next:5.3.2 Поиск в упорядоченном векторе
Up:5.3 Программы обработки векторов
Previous:5.3 Программы обработки векторов


© В.Н. Касьянов, Е.В.Касьянова, 2004