- •Основы разработки алгоритмов
- •Издание посвящается 400-летию г. Томска
- •1.Рекуррентные алгоритмы
- •Задачи для самостоятельного решения 1
- •2.Подпоследовательности в массиве
- •Задачи для самостоятельного решения
- •3.Упорядоченность в массиве
- •Задачи для самостоятельного решения
- •4.Матрицы
- •Задачи для самостоятельного решения.
- •5.Обработка текста
- •Задачи для самостоятельного решения
- •6.Информационные массивы
- •Задачи для самостоятельного решения.
- •7.Советы по решению задач
- •8.Краткий справочник по языку паскаль Структура программы
- •Типы данных
- •Операторы
- •Литература
Задачи для самостоятельного решения 1
Дан вещественный массив длины n. Найти сумму квадратов элементов массива.
Дан вещественный массив длины n. Найти суммы положительных и отрицательных элементов массива.
Для заданного целого неотрицательного n вычислить значение факториала
.
(
).Для заданного целого неотрицательного n вычислить значения двойных факториалов
и
.Вычислить n-е число Фибоначчи
,
используя рекуррентное соотношение:
,
,
при
.Вычислить – n-е число Фибоначчи ранга 3, используя рекуррентное соотношение:
,
,
при
.
По заданному вещественному значению x и массиву вещественных коэффициентов вычислить значение полинома
.Для заданного вещественного x и целого n вычислить приближенное значение
.
Для заданного вещественного x и целого n вычислить приближенное значение
Для заданного вещественного x и целого n вычислить приближенное значение
.
Для заданного вещественного x и целого n вычислить приближенное значение
.
Для заданного вещественного x и целого n вычислить приближенное значение
.
Для заданного вещественного значения
и числа итераций n
вычислить приближенное значение
,
используя рекуррентное соотношение:
,
,
при
.Вычислить наибольший общий делитель (НОД) целых положительных чисел a и b, используя следующие соотношения:
НОД(a, b) = НОД(b, a),
НОД(a, 0) = a,
НОД(a,
b)
= НОД(b,
a
mod b),
если
.
** По заданному целому положительному значению N вычислить и сохранить в массиве набор десятичных цифр N.
2.Подпоследовательности в массиве
Подпоследовательностью в массиве называется группа элементов, обладающая каким-нибудь общим свойством. Например, несколько рядом стоящих равных друг другу элементов, или элементы, стоящие на подряд идущих четных местах в массиве и имеющие четное значение, и т.п.
Самая длинная подпоследовательность. Совокупность следующих друг за другом равных по значению элементов целочисленного массива A назовем подпоследовательностью. Найти подпоследовательность максимальной длины.
Полный ответ на вопрос задачи должен указывать, с какого элемента в исходном массиве начинается найденная подпоследовательность и какова ее длина.
Составим несколько тестов.
|
Исходный массив |
Длина |
Начало |
1. |
1 2 1 2 1 2 1 2 1 2 |
1 |
нет |
2. |
1 2 2 2 1 2 1 1 1 2 |
3 |
2 |
3. |
1 2 2 2 1 1 1 1 1 1 |
6 |
5 |
4. |
1 1 1 1 1 1 1 1 1 1 |
10 |
1 |
Тест №1 показывает, что подпоследовательности в массиве могут отсутствовать.
Тест №2 содержит 2 подпоследовательности одинаковой длины. В таких случаях в качестве результата берем первую из найденных.
Тест №3 показывает, что массив может завершаться подпоследовательностью.
В тесте №4 весь исходный массив является подпоследовательностью.
Совпадение соседних элементов всегда означает наличие подпоследовательности. Если соседние элементы не равны, то возможен один из четырех случаев:
одна подпоследовательность закончилась, а другая началась;
подпоследовательности не было, но другая начинается;
одна закончилась, а другой не будет;
подпоследовательностей нет вообще.
Такое разнообразие ситуаций можно легко объединить, если допустить существование подпоследовательностей длиной 1. Тогда любое несовпадение соседних элементов означает конец одной и начало другой подпоследовательности. Конечный результат от этого не пострадает, если считать, что максимальная длина, равная 1, означает отсутствие подпоследовательностей. Поскольку подпоследовательности не могут перекрываться, задача решается на основе последовательного сравнения друг с другом соседних элементов в массиве. Как только подпоследовательность закончилась, следует сравнить ее длину с ранее найденной максимальной
.
Договоримся использовать следующие переменные:
tekdl – длина текущей подпоследовательности;
teknach – начальный номер текущей подпоследовательности;
maxdl – максимальная длина;
maxnach – начальный номер искомой подпоследовательности.
Алгоритм 1.
Пошаговая разработка
начальные значения;
for i:=1 to n-1 do
if A[i]=A[i+1]
then идет подпоследовательность
else begin
подпоследовательность закончилась;
другая началась
end;
подпоследовательность закончилась;
начальные значения
tekdl:=1; teknach:=1; maxdl:=1;
идет подпоследовательность
tekdl:=tekdl+1;
подпоследовательность закончилась
if tekdl>maxdl
then begin
maxdl:=tekdl;
maxnach:=teknach
end;
другая началась
tekdl:=1;
teknach:=i+1;
Результат пошаговой разработки
tekdl:=1; teknach:=1; maxdl:=1;
for i:=1 to n-1 do
if A[i]=A[i+1]
then tekdl:=tekdl+1
else begin
if tekdl>maxdl
then begin
maxdl:=tekdl;
maxnach:=teknach
end;
tekdl:=1;
teknach:=i+1;
end;
if tekdl>maxdl
then begin
maxdl:=tekdl;
maxnach:=teknach
end;
Трудоемкость алгоритма – линейная.
Другой вариант решения этой задачи основан на применении циклов while.
Алгоритм 2.
Пошаговая разработка
начальные значения;
while не закончился массив do begin
идем по подпоследовательности;
подпоследовательность закончилась;
пропускаем неравные;
другая началась
end;
начальные значения
tekdl:=1; teknach:=1; maxdl:=1; i:=1;
не закончился массив
i<=n-1; {чтобы не выйти за границы массива при сравнении предпоследнего элемента с последним}
идем по подпоследовательности
while (i<=n-1)and(A[i]=A[i+1]) do begin
tekdl:=tekdl+1;
i:=i+1;
end;
подпоследовательность закончилась и другая началась детализируются так же, как в предыдущем алгоритме.
пропускаем неравные
while (i<=n-1)and(A[i]<>A[i+1]) do
i:=i+1;
Результат пошаговой разработки
tekdl:=1; teknach:=1; maxdl:=1; i:=1;
while i<=n-1 do begin
while (i<=n-1)and(A[i]=A[i+1]) do begin
tekdl:=tekdl+1;
i:=i+1;
end;
if tekdl>maxdl
then begin
maxdl:=tekdl;
maxnach:=teknach
end;
while (i<=n-1)and(A[i]<>A[i+1]) do
i:=i+1;
tekdl:=1;
teknach:=i;
end;
