Program znanija;
const n = 5;
var
a:array[1..n] of integer;
premax, premaxi, maxi, max, i, b:integer;
begin
max := -1000;
write('Введите массив из ', n, ' элементов:');
for i := 1 to n do
begin
read(b);
a[i] := b;
if b > max then
begin
premax := max;
premaxi := maxi;
max := b;
maxi := i;
end;
end;
writeln('Максимальный элемент №1: ', max, ',его номер ', maxi);
writeln('Максимальный элемент №2: ', premax, ',его номер ', premaxi);
end.
По формуле
или ![i = \lceil {\log_2{N}} \rceil](https://tex.z-dn.net/?f=i+%3D+%5Clceil+%7B%5Clog_2%7BN%7D%7D+%5Crceil+)
Глубина цвета
бит
Объем памяти = 128 * 128 пикселей * 5.0 бит = 81920.0 бит
81920.0 бит = 10240.0 байт = 10.0 Кбайт = 0.009765625 Мбайт = 9.5367431640625e-06 Гбайт = 9.313225746154785e-09 Tбайт
81920.0 бит = 80.0 Кбит = 0.078125 Мбит = 7.62939453125e-05 Гбит = 7.450580596923828e-08 Tбит
Представим, что мы знаем ответ на вопрос "чему равна сумма всех выписанных чисел при выполнении вызова F(n)" для всех n < k. Попробуем понять, как найти ответ для n = k.
Что делает F(n)? Читаем текст программы: сначала выводит n, а потом (если n > 0) запускает F(n - 1) и F(n - 3). Обозначим S(n) - сумму всех чисел после вызова F(n), тогда (при n > 0)
S(n) = n + S(n - 1) + S(n - 3)
Для неположительных n получаем, что S(n) = n (т.к. F(n) просто выводит n и завершает работу, не запуская никаких других F).
Остается только расписать, чему равно S(5)...
S(-2) = -2
S(-1) = -1
S(0) = 0
S(1) = 1 + S(0) + S(-2) = 1 + 0 - 2 = -1
S(2) = 2 + S(1) + S(-1) = 2 - 1 - 1 = 0
S(3) = 3 + S(2) + S(0) = 3 + 0 + 0 = 3
S(4) = 4 + S(3) + S(1) = 4 + 3 - 1 = 6
S(5) = 5 + S(4) + S(2) = 5 + 6 + 0 = 11
Ответ. 11.
______________
При исследовании рекурсивных алгоритмов бывает полезно понять, сколько вызовов функций делает программа (например, если рисовать дерево вызовов, это будет показывать количество "стрелочек" на этом дереве). Представим себе, что мы стали выполнять алгоритм на бумаге, попробуем понять, сколько чисел придется выписывать.
Если #(N) - число вызовов процедуры F при наивном вычислении F(N). Понятно, что #(N) = #(N - 1) + #(N - 3) (при N <= 0 #(N) = 1). Не задаваясь целью получить точную формулу для #(N), получим только оценку (на самом деле, весьма показательную).
Очевидно, что #(N - 1) >= #(N - 3), тогда #(N) >= 2 * #(N - 3).
Так как #(0) = 1, то #(3) >= 2 * #(0) = 2, #(6) >= 2 * #(3) >= 2^2, #(9) >= 2 * #(6) >= 2^3, и вообще #(3N) >= 2^N
Отсюда можно предположить, что #(N) растет не медленнее, чем 2^(N/3) >= 1.25^N. Если 1,25^N кажется медленно растущей функцией - это вовсе не так, для N = 100 (это немного, наверно?) получим число, большее миллиарда. Так что если не запоминать промежуточные результаты, результат будет считаться ооочень долго. S(N) также растет быстро, но это уже другая проблема.
Посчитаем сколько всего узлов на этом листке:
у нас он N клеточек в высоту, значит всего в каждом столбике <span>N+1 узел;
у нас он М клеточек в ширину, значит всего в каждой строчке М+1 узел.
Значит всего узлов (</span><span>N+1)*(М+1).
Чтобы определьть прямоугольник, надо определить два узла в которых будут противоположные углы:
первый узел мы можем выбрать (</span><span>N+1)*(М+1) способами;
второй узел мы можем выбрать </span><span>N*М способами (мы не можем выбрать тот столбик и тот ряд, в котором у нас стоит первый узел).
Тоэсть всего способов выбрать (</span>N+1)*(М+1)*<span>N*М, но это не так.
Рассмотрим весь лист как выбраный прямоугольник.
Пусть мы его выбрали так:
(0; 0), (</span><span>N+1; М+1).
Этот же прямоугольник мы считали, когда плучали с такими координатами:
1) (</span><span>N+1; М+1), (0; 0).
2) (</span><span>N+1; 0), (0; М+1).
3) (0; М+1), (</span><span>N+1; 0).
И так с каждым прямоугольником, тоэсть каждый прямоугольник мы считаем 4 раза, тоэсть конечная формула такова:
</span>(N+1)*(М+1)*N*М / 4.
Осталось составить прогрмму, которая будет это вичислять.
С++:
#include <iostream>using namespace std;int main()
{
int N, M, k;
cin >> N >> M;
k = (N+1)*(M+1)*N*M / 4;
cout << k << endl;
return 0;
}
Pascal:
program Znanija;
var N, M, k:integer;
begin
read(N);
read(M);
k:=((N+1)*(M+1)*N*M) div 4;
writeln();
writeln(k);
end.
Архиватор - WinRAR
Коммуникационная программа - <span>Outlook Express
</span>Системы программирования - <span>Microsoft Visual Basic
Электронные таблицы - Microsoft Excel
Игры - CS:GO
Графический редактор - Paint
Текстовый редактор - Microsoft Word</span>