Программирование на языке Pascal
Базисные понятия в программировании. Последовательные и максимально подробные разборы задач: анализ, составление алгоритма и детальное описание решения. Реверсная запись трехзначного числа и особенность подсчета количества единичных битов числа.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | задача |
Язык | русский |
Дата добавления | 18.02.2015 |
Размер файла | 246,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
где вместо многоточия нужно дописать все недостающие члены суммы. Очевидно, что это сумма первых (n + 2) членов арифметической прогрессии с вычтенным из нее числом 2.
Как известно, сумма k первых членов арифметической прогрессии выражена формулой:
,
где a1 - первый член прогрессии, ak - последний.
Подставляя в эту формулу наши исходные данные и учитывая недостающее до полной суммы число 2, получаем следующее выражение:
Чтобы найти асимптотическую сложность алгоритма, отбросим коэффициенты при переменных и слагаемые с низшими степенями (оставив, соответственно, слагаемое с самой высокой степенью). При этом у нас остается член n2, значит, асимптотическая сложность алгоритма - O(n2).
Конечно, в дальнейшем мы не будем так подробно находить асимптотическую сложность алгоритмов, а тем более, вычислять количество требуемых операций, что интересно только теоретически. На самом деле, конечно, нас интересует лишь порядок роста времени работы алгоритма (количества необходимых операций), который можно выявить из анализа вложенности циклов и некоторых других характеристик.
Задача № 19. Вывести на экран первых n простых чисел
Формулировка. Дано натуральное число n. Вывести на экран n первых простых чисел. Например, при вводе числа 10 программа должна вывести ответ: 2 3 5 7 11 13 17 19 23 29
Решение. Эта задача похожа на предыдущую тем, что здесь нам тоже необходимо проверить все натуральные числа на некотором отрезке, на этот раз используя еще один счетчик для подсчета найденных простых. Однако на этот раз мы не можем узнать, сколько придется проверить чисел, пока не насчитается n простых. Следовательно, здесь нам не подходит цикл for, так как мы не можем посчитать необходимое количество итераций.
Здесь нам поможет цикл while. Напомним, что тело цикла while повторяется до тех пор, пока остается истинным булевское выражение в его заголовке (поэтому его еще называют циклом с предусловием). Так как while не имеет переменной цикла, которая увеличивается на 1 с каждым следующим шагом, то при его использовании необходимо обеспечить изменение некоторых переменных в теле цикла, от которых зависит условие в его заголовке, таким образом, чтобы при достижении требуемого результата оно стало ложным.
Так как мы должны найти и вывести n первых простых чисел, подсчитывая их, и с каждый найденным простым числом некоторый счетчик (пусть это будет primes с начальным значением 0) увеличивается на 1, то условием в заголовке while будет выражение primes < n. Иными словами, цикл продолжается, пока число найденных чисел меньше требуемого. На последнем же шаге будет выведено последнее число, primes станет равным n и следующего шага цикла уже не будет, так как условие в его заголовке станет ложным. На этом работа программы будет закончена.
Проверяться на простоту будет некоторое число k, которое с каждой итерацией цикла обязательно будет увеличиваться на 1 (таким образом, мы будем двигаться по отрезку натуральных чисел, пока не выберем из него заданное количество простых).
Алгоритм на естественном языке:
1) Ввод n;
2) Обнуление переменной primes;
3) Присваивание переменной k значения 1;
4) Запуск цикла с предусловием primes < n. В цикле:
1. Обнуление переменной count;
2. Запуск цикла, при котором i изменяется от 1 до k. В цикле:
a. Если k делится на i, то увеличиваем значение переменной count на 1;
3. Если count = 2, выводим на экран число k, символ пробела и увеличиваем значение счетчика primes на 1;
4. Увеличиваем значение k на 1.
Код:
1. program FirstNPrimes; 2. 3. var 4. i, k, n, count, primes: word; 5. 6. begin 7. readln(n); 8. k := 1; 9. primes := 0; 10. while primes < n do begin 11. count := 0; 12. for i := 1 to k do begin 13. if k mod i = 0 then inc(count) 14. end; 15. if count = 2 then begin 16. write(k, ' '); 17. inc(primes) 18. end; 19. inc(k) 20. end 21. end. |
Выполним ручную прокрутку алгоритма, взяв в качестве n число 2. При этом будем уже по привычке красным цветом обозначать переменные, изменившиеся после выполнения данной строки, а прочерком те, которые на данном шаге не определены, так как алгоритм до них еще «не дошел». При повторении шагов цикла итерации явно считать не будем (хотя легко увидеть, что их номерам полностью соответствует изменяющаяся после каждого очередного выполнения тела переменная k), и в таблице будет указана лишь та строка, которая выполняется. На тех шагах, на которых переменные не изменяются, будем пояснять смысл выполняющихся операторов.
Для наглядности все же отделим друг от друга четные и нечетные шаги основного цикла while, при этом его внутренний цикл будем считать самоочевидным и в строке 12-14 будем фиксировать те значения переменных, которые будут получены по выходу из него.
№ строки |
n |
k |
primes |
i |
count |
|
7 |
2 |
-- |
-- |
-- |
-- |
|
8 |
2 |
1 |
-- |
-- |
-- |
|
9 |
2 |
1 |
0 |
-- |
-- |
|
10 |
(primes < n) = true - входим в цикл |
|||||
11 |
2 |
1 |
0 |
-- |
0 |
|
12-14 |
2 |
1 |
0 |
от 1 до 1 |
1 |
|
15-18 |
(count = 2) = false |
|||||
19 |
2 |
2 |
0 |
-- |
1 |
|
10 |
(primes < n) = true - входим в цикл |
|||||
11 |
2 |
2 |
0 |
-- |
0 |
|
12-14 |
2 |
2 |
0 |
от 1 до 2 |
2 |
|
15 |
(count = 2) = true |
|||||
16 |
Вывод числа k (то есть 2) |
|||||
17-18 |
2 |
2 |
1 |
-- |
2 |
|
19 |
2 |
3 |
1 |
-- |
2 |
|
10 |
(primes < n) = true - входим в цикл |
|||||
11 |
2 |
3 |
1 |
-- |
0 |
|
12-14 |
2 |
3 |
1 |
от 1 до 3 |
2 |
|
15 |
(count = 2) = true |
|||||
16 |
Вывод числа k (то есть 3) |
|||||
17-18 |
2 |
3 |
2 |
-- |
2 |
|
19 |
2 |
4 |
2 |
-- |
2 |
|
10 |
(primes < n) = false - программа завершена |
Как видим, описать действия даже такого элементарного алгоритма и даже при столь малых исходных данных - достаточно трудоемкая и трудно проверяемая задача, поэтому очень важно понимать логику самой программы и уметь представлять себе целостную картину ее поведения с минимальными потребностями в моделировании.
Вычислительная сложность. Так как в данной задаче в главном цикле присутствует вложенный, в котором происходит ровно k операций (сложность этой конструкции мы определили в задаче 18), то его сложность явно не меньше O(n2) и превышает ее, так как нам явно необходимо выполнить более чем n шагов главного цикла. При этом точность расчета сложности зависит от распределения простых чисел, которое описывается с помощью достаточно сложных математических приемов и утверждений, так что мы не будем далее рассматривать эту задачу.
Задача № 20. Проверить, является ли заданное натуральное число совершенным
Формулировка. Дано натуральное число. Проверить, является ли оно совершенным.
Примечание: совершенным числом называется натуральное число, равное сумме всех своих собственных делителей (то есть натуральных делителей, отличных от самого числа). Например, 6 - совершенное число, оно имеет три собственных делителя: 1, 2, 3, и их сумма равна 1 + 2 + 3 = 6.
Решение. Эта задача напоминает задачу 16, в которой нужно было найти количество всех натуральных делителей заданного числа. Напомним код ее основной части (назовем его кодом 1):
count := 0;
for i := 1 to n do begin
if n mod i = 0 then inc(count)
end;
Как видно, в этом цикле проверяется делимость числа n на все числа от 1 до n, причем при каждом выполнении условия делимости увеличивается на 1 значение счетчика count с помощью функции inc. Чтобы переделать этот код под текущую задачу, нужно вместо инкрементации (увеличения значения) переменной-счетчика прибавлять числовые значения самих делителей к некоторой переменной для хранения суммы (обычно ее мнемонически называют sum, что в пер. с англ. означает «сумма»). В связи с этим оператор
if n mod i = 0 then inc(count);
в коде 1 теперь уже будет выглядеть так:
if n mod i = 0 then sum := sum + i;
Кроме того, чтобы не учитывалось само число n при суммировании его делителей (насколько мы помним, этот делитель не учитывается в рамках определения совершенного числа), цикл должен продолжаться не до n, а до n - 1. Правда, если говорить точнее, то цикл следовало бы проводить до n div 2 (также это обсуждалось в задаче 14), так как любое число n не может иметь больших делителей, иначе частное от деления должно быть несуществующим натуральным число между 1 и 2.
Единственное, что останется теперь сделать - это вывести ответ, сравнив число n с суммой его делителей sum как результат булевского выражения через writeln:
writeln(n = sum);
Код:
1. program PerfectNumbers; 2. 3. var 4. i, n, count: word; 5. 6. begin 7. readln(n); 8. count := 0; 9. for i := 1 to n div 2 do begin 10. if n mod i = 0 then sum := sum + i 11. end; 12. writeln(n = sum) 13. end. |
Задача № 21. Проверить, являются ли два натуральных числа дружественными
Формулировка. Даны два натуральных числа. Проверить, являются ли они дружественными.
Примечание: дружественными числами называются два различных натуральных числа, для которых сумма всех собственных делителей первого числа равна второму числу и сумма всех собственных делителей второго числа равна первому числу.
Например, 220 и 284 - пара дружественных чисел, потому что:
Сумма собственных делителей 220: 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
Сумма собственных делителей 284: 1 + 2 + 4 + 71 + 142 = 220
Решение. Эта задача напоминает задачу 19, так как в ней мы тоже считали сумму собственных делителей введенного числа, а затем сравнивали эту сумму с самим числом, проверяя его на предмет совершенности. В данном же случае нам нужно найти не только сумму собственных делителей первого числа (обозначим число как n1, а сумму его делителей sum1), но и второго числа (возьмем обозначения n2 и sum2 соответственно). Тогда ответом в задаче послужит сравнение: (n1 = sum2) and (n2 = sum1). Кстати, здесь впервые в нашем повествовании мы используем логические операции (напомним, что логическое выражение X1 and X2 принимает значение истины тогда и только тогда, когда истинны булевские выражения X1 и X2, а в остальных случаях оно принимает ложное значение).
Однако предложенную схему можно упростить. Покажем это на примере: пусть даны числа 8 и 4. Считаем сумму собственных делителей числа 8: 1 + 2 + 4 = 7. Это число отлично от 4, поэтому пара уже не соответствует определению дружественных чисел. Можно сразу вывести отрицательный ответ, избежав подсчета суммы делителей второго числа. Если были бы даны числа 8 и 7, то необходимо было бы вычислить сумму собственных делителей числа 7, она равна 1 (так как оно простое). Теперь необходимо сравнить сумму собственных делителей второго с первым числом: так как 1 отлично от 8, числа не дружественные.
Покажем на блок-схеме, как можно разветвить программу (вычисление обоих сумм не изображается):
Таким образом, без логических операций можно и обойтись.
Код:
1. program AmicableTest; 2. 3. var 4. i, n1, n2, sum1, sum2: word; 5. 6. begin 7. readln(n1, n2); 8. for i := 1 to n1 div 2 do begin 9. if n1 mod i = 0 then sum1 := sum1 + i 10. end; 11. if sum1 = n2 then begin 12. for i := 1 to n2 div 2 do begin 13. if n2 mod i = 0 then sum2 := sum2 + i 14. end; 15. writeln(sum2 = n1) 16. end 17. else begin 18. writeln('False') 19. end 20. end. |
Задача № 22. Найти наибольший общий делитель двух натуральных чисел
Формулировка. Даны два натуральных числа. Найти их наибольший общий делитель.
Примечание: наибольшим общим делителем (сокращенно пишут НОД) двух натуральных чисел m и n называется наибольший из их общих делителей. Обозначение: НОД(m, n).
Примечание 2: общим делителем двух натуральных чисел называется натуральное число, на которое натуральное число, которое является делителем обоих этих чисел.
Например, найдем НОД(12, 8):
Выпишем все делители числа 12: 1, 2, 3, 4, 6, 12;
Выпишем все делители числа 8: 1, 2, 4, 8;
Выпишем все общие делители чисел 12 и 8: 1, 2, 4. Из них наибольшее число - 4. Это и есть НОД чисел 12 и 8.
Решение. Конечно, при решении мы не будем выписывать делители и выбирать нужный. В принципе, ее можно было бы решить как задачу 14, начав цикл с наименьшего из двух заданных чисел (так как оно тоже может быть НОД, например, НОД(12, 4) = 4). Но мы воспользуемся так называемым алгоритмом Евклида нахождения НОД, который выведен с помощью математических методов. В самом простейшем случае для заданных чисел m и n он выглядит так:
1) Если m неравно n, перейти к шагу 2, в противном случае вывести m и закончить алгоритм;
2) Если m > n, заменить m на m - n, в противном случае заменить n на n - m;
3) Перейти на шаг 1
Как видим, в шаге 2 большее из двух текущих чисел заменяется разностью большего и меньшего.
Приведем пример для чисел 12 и 8:
a. Так как 12 > 8, заменим 12 на 12 - 8 = 4;
b. Так как 8 > 4, заменим 8 на 8 - 4 = 4;
c. 4 = 4, конец.
Не проводя каких-либо рассуждений над алгоритмом и не доказывая его корректности, переведем его описание в более близкую для языка Pascal форму:
Алгоритм на естественном языке:
1) Ввод m и n;
2) Запуск цикла с предусловием m < > n. В цикле:
1. Если m > n, то переменной m присвоить m - n, иначе переменной n присвоить n - m;
3) Вывод m:
Код:
1. program GreatestCommonDiv; 2. 3. var 4. m, n: word; 5. 6. begin 7. readln(m, n); 8. while m <> n do begin 9. if m > n then begin 10. m := m - n 11. end 12. else begin 13. n := n - m 14. end 15. end; 16. writeln(m) 17. end. |
Задача № 23. Найти наименьшее общее кратное двух натуральных чисел
Формулировка. Даны два натуральных числа. Найти их наименьшее общее кратное.
Примечание: наименьшим общим кратным двух чисел m и n называется наименьшее натуральное число, которое делится на m и n. Обозначение: НОК(m, n)
Решение. Из теории чисел известно, что НОК(m, n) связан с НОД(m, n) следующим образом:
Следовательно, для нахождения ответа нам нужно лишь использовать предыдущую задачу нахождения НОД двух чисел m и n:
while m <> n do begin
if m > n then begin
m := m - n
end
else begin
n := n - m
end
end;
Так как исходные переменные будут испорчены в процессе работы алгоритма Евклида, нам нужно вычислить их произведение до входа в описанный выше цикл и присвоить это произведение переменной prod (от англ. product - «произведение»):
prod := m * n;
После этого нам остается вывести на экран результат арифметического выражения в правой части нашей формулы. В качестве самого НОД будет использоваться переменная m:
writeln(prod div m);
Кстати, деление в формуле будет целочисленным (через div) именно потому, что если два числа делятся на некоторое число, то и их произведение также делится на него.
Код:
1. program LeastCommonMult; 2. 3. var 4. m, n, prod: word; 5. 6. begin 7. readln(m, n); 8. prod := m * n; 9. while m <> n do begin 10. if m > n then begin 11. m := m - n 12. end 13. else begin 14. n := n - m 15. end 16. end; 17. writeln(prod div m) 18. end. |
Задача № 24. Вычислить xn
Формулировка. Даны натуральные числа x и n (которое также может быть равно 0). Вычислить xn.
Решение. Для того чтобы решить эту задачу, вспомним определение степени с натуральным показателем: запись xn означает, что число x умножено само на себя n раз.
Сразу из определения видно, что здесь заранее известно количество повторений при вычислении результата, так что задача легко решается через цикл for. Выходит, мы копируем исходное число x в некоторую переменную res (от англ. result - «результат»), а затем просто умножаем его на x n раз? Не стоит торопиться с ответом.
Рассмотрим пример: 34 = 3 * 3 * 3 * 3 = 81. Если посмотреть на эту запись, то мы видим, что возведение в четвертую степень как выражение содержит четыре слагаемых, но только три операции, так как мы с первого шага домножаем число 3 на три тройки. Тогда реализация идеи из абзаца выше будет давать число в степени на 1 больше, чем требуется.
Какой можно придумать выход? Например, можно сократить цикл на одну операцию, но что тогда будет при вычислении нулевой степени? Как известно, любое число в нулевой степени дает 1, а здесь при вводе в качестве n нуля приведет к тому, что не будет осуществлен вход в цикл (так как не существует целочисленного отрезка от 1 до 0) и в итоге на выход так и пойдет исходное число x.
А что, если изменить схему умножения так: 34 = 1 * 3 * 3 * 3 * 3 = 81? Так мы можем сравнять показатель степени и число требуемых операций, да и с нулевой степенью все становится просто, так как при вводе в качестве n нуля не будет осуществляться вход в цикл и на выход в программе пойдет число 1!
Теперь алгоритм на естественном языке:
1) Ввод x и n;
2) Присваивание переменной res числа 1;
3) Запуск цикла, при котором i изменяется от 1 до n. В цикле:
1. Присваиваем переменной res значение res * x;
4) Вывод переменной res.
Код:
1. program Exponentiation; 2. 3. var 4. x, n, i, res: word; 5. 6. begin 7. readln(x, n); 8. res := 1; 9. for i := 1 to n do begin 10. res := res * x 11. end; 12. writeln(res) 13. end. |
Кстати, стоит понимать, что объявление переменной res при использовании типа word достаточно условно, так как этот тип принимает значения от 0 до 65535, что на единицу меньше числа 2562, хотя вводить в программу можно числа, предполагающие возведение в более высокую степень. Так как в условии задачи не сказано ничего о том, в каком числовом промежутке по x и n она должна выдавать корректный ответ, оставим это в таком виде, достаточном для проверки приложения на работоспособность.
Задача № 25. Вычислить xn по алгоритму быстрого возведения в степень
Формулировка. Даны натуральные числа x и n. Вычислить xn, используя алгоритм быстрого возведения в степень:
Решение. Разберем этот пока неясный алгоритм, представленный в нашей задаче лишь единственной формулой. Легко понять, что указанное равенство имеет место: например, 34 = 34 div 2 = (32)2 = 92 = 81. Другой пример: 45 = 4 * (42)5 div 2 = 4 * (42)2 = 4 * 162 = 4 * 256 = 1024. Причем если выражение со степенью нельзя в один шаг преобразовать таким образом, то необходимо продолжить преобразование выражения вплоть до получения конечного ответа. Однако как теперь реализовать эту схему?
Рассмотрим пример немного сложнее. Вычислим 47 = 4 * (42)3 = 4 * (16)3 = 4 * 16 * (162)1 = 4 * 16 * 256 = 16384. Стоит обратить внимание на то, что на каждом шаге при вычислении изменяется только единственное обрабатывающееся число, а остальные множители выносятся однократно и необходимы только для получения ответа в последнем действии.
Чтобы исключить их из рассмотрения, при нечетном текущем числе n мы будем домножать на них некоторую промежуточную переменную r, поначалу равную 1 (кстати, нечетность числа в Pascal определяет функция odd), затем (уже независимо от условий) возведем в квадрат текущее x и разделим n на 2 с отбрасыванием остатка. При повторении этих действий на некотором шаге n обязательно станет равным 1. Это происходит потому, что деление любого нечетного числа a на 2 с отбрасыванием остатка равносильно делению на двойку числа (a - 1), которое является четным, и при делении, двигаясь по цепочке четных чисел, мы всегда придем к единице. Условие n = 1 и будет окончанием цикла с предусловием. По выходе из цикла необходимо будет в качестве ответа вывести последнее значение x, умноженное на r.
Теперь алгоритм на естественном языке:
1) Ввод x и n;
2) Присваивание переменной r числа 1;
5) Запуск цикла с предусловием n < > 1. В цикле:
1. Если n нечетно, домножаем r на x;
2. Переменной x присваиваем значение x * x;
3. Переменной n присваиваем результат от деления этой переменной на 2 с отбрасыванием остатка;
3) Вывод выражения x * r.
Код:
1. program FastExponentiation; 2. 3. var 4. x, n, r: word; 5. 6. begin 7. readln(x, n); 8. r := 1; 9. while n <> 1 do begin 10. if odd(n) then r := r * x; 11. x := x * x; 12. n := n div 2 13. end; 14. writeln(x * r) 15. end. |
Из анализа данного алгоритма известно, что его асимптотическая сложность порядка O(log2n).
Задача № 26. Решить квадратное уравнение заданного вида с параметром
Формулировка. Дано натуральное число n. Вывести на экран решения всех квадратных уравнений вида x2 + 2ax - 3 = 0 для всех a от 1 до n.
Решение. Эта задача очень похожа на задачу 12. В принципе, ее можно было бы решить, используя код этой задачи, взяв первый и последний коэффициенты равными 1 и -3 соответственно и запустив цикл по всем a от 1 до n, умножив a на 2 во всех формулах.
Однако исследуем это уравнение математически и попытаемся оптимизировать решение:
1) Найдем дискриминант уравнения:
Очевидно, что найденная величина неотрицательна, и, если быть точнее, то при a от 1 до n она всегда принимает значение не меньше 16 (так как при a = 1 она равна 4 * (1 + 3) = 4 * 4 = 16). Следовательно, наше уравнение всегда имеет решение, причем их два.
2) Найдем формулы корней уравнения:
Итак, формулы корней уравнения получены, и теперь только осталось вывести в цикле значения корней для всех a от 1 до n, не забыв сделать вывод форматированным (так как решения будут вещественными).
Код:
1. program MyQuadraticEquation; 2. 3. var 4. a, n: word; 5. x1, x2: real; 6. 7. begin 8. readln(n); 9. for a := 1 to n do begin 10. x1 := sqrt(a * a + 3) - a; 11. x2 := -a - sqrt(a * a + 3); 12. writeln('a = ', a, ', x1 = ', x1:4:2, ', x2 = ', x2:4:2) 13. end 14. end. |
Задача № 27. Вычислить значение многочлена в точке
Формулировка. Дано натуральное число n, вещественное число x и набор вещественных чисел an, an-1, ..., a0. Вычислить значение многочлена n-ной степени с коэффициентами an, an-1, ..., a0 от одной переменной в точке x.
Примечание: многочленом n-ной степени от одной переменной x называется выражение вида anxn + an-1xn-1 + ... + a1x + a0, где an, an-1, ..., a0 - коэффициенты.
Решение. Собственно, в этой задаче требуется возведение переменной x (точнее, конкретного ее значения) в некоторую степень n - 1 раз, а также n операций умножения и n операций сложения. В принципе, для полноценного решения она не требует одновременного знания более чем одного коэффициента, так как мы можем в цикле ввести коэффициент an в переменную a, умножить его на xn и прибавить полученное число к переменной результата res (которой перед входом в цикл должно быть присвоено значение 0) и повторить этот шаг для всех коэффициентов. Тогда количество операций: (1 + 2 + ... + n + 2n), что примерно соответствует асимптотической сложности O(n2).
Не занимаясь реализацией этого алгоритма, давайте оптимизируем его. Например, пусть нам дан многочлен третьей степени a3x3 + a2x2 + a1x + a0. Вынесем за скобки общий множитель x при слагаемых, в которых это возможно. Получим: (a3x2 + a2x + a1)x + a0. Вынесем за скобки x также и в полученном выражении со скобками, в итоге получим: ((a3x + a2)x + a1)x + a0.
Полученную форму записи называют схемой Горнера. Очевидно, что она существует для многочлена любой степени.
Итак, имея n = 3 и коэффициенты a3, a2, a1 и a0, мы можем посчитать его значение с помощью n операций умножения и n операций сложения, а это значит, что для вычисления требуется порядка 2n операций и алгоритм имеет линейную асимптотическую сложность O(n), что демонстрирует очевидное преимущество перед предыдущим решением.
Посмотрим, как может выглядеть цикл, в котором вычисляется значение многочлена в точке. Для этого немного изменим представление в виде схемы Горнера, не меняя при этом значения многочлена: (((0x + a3)x + a2)x + a1)x + a0.
Теперь нам требуется n + 1 операций, однако заведя переменную res для накопления результата, которая перед входом в цикл будет равна 0, мы можем, вводя коэффициенты a3, a2, a1 и a0, посчитать значение многочлена в одном цикле:
res := 0;
for i := 1 to n + 1 do begin
read(a);
res := res * x + a
end;
Примечание: оператор read нужен нам для того, чтобы можно было вводить коэффициенты через пробел, а не через Enter.
Теперь разберем сам цикл. На первом шаге мы получаем в res значение выражения 0x + a3 = a3, на втором - a3x + a2, на третьем - (a3x + a2)x + a1, на четвертом - ((a3x + a2)x + a1)x + a0. Как видно, формула полностью восстановилась, причем вычисление идет от наиболее вложенных скобок к верхним уровням.
Код:
1. program ValueOfPolynomial; 2. 3. var 4. i, n: byte; 5. x, a, res: real; 6. 7. begin 8. readln(n, x); 9. res := 0; 10. for i := 1 to n + 1 do begin 11. read(a); 12. res := res * x + a 13. end; 14. writeln(res:4:2) 15. end. |
Задача № 28. Вычислить факториал
Формулировка. Дано натуральное число n (которое также может быть равно нулю). Вычислить n!
Примечание: n! (факториал числа n, читается «эн факториал») - произведение всех натуральных чисел до n включительно.
Решение. Задача очень просто решается через цикл for по всем i от 1 до n, в теле которого мы на каждом шаге домножаем переменную-результат fact (которой до входа в цикл присвоено значение 1) на i. При этом сохраняется и правило 0! = 1, так как при вводе нуля программа не войдет в цикл и на выход пойдет неизмененное в переменной fact число 1.
Код:
1. program Factorial; 2. 3. var 4. i, n: byte; 5. fact: integer; 6. 7. begin 8. readln(n); 9. fact := 1; 10. for i := 1 to n do begin 11. fact := fact * i 12. end; 13. writeln(fact) 14. end. |
Примечание: для накопления результата мы использовали переменную fact типа integer. Как уже говорилось, этот тип охватывает диапазон целых чисел от -2147483648 до 2147483647 (Borland Delphi 7 и PascalABC). Данная переменная позволит сформировать результаты вплоть до 12! (= 479001600) включительно.
Задача № 29. Вычислить число сочетаний из n по k
Формулировка. Даны натуральные числа n и k (k не превышает n). Вычислить число сочетаний из n по k.
Примечание: в комбинаторике сочетанием из n по k называется набор k элементов, выбранных из данных n элементов; при этом наборы, отличающиеся только порядком следования элементов, считаются одинаковыми. Обозначение числа сочетаний из n по k элементов: . При этом считается, что , и для любого натурального n.
Например, найдем все 2-элементные сочетания 3-элементного множества {1, 2, 3}. Таковыми являются {1, 2}, {1, 3} и {2, 3}. То есть, таковых сочетаний 3. При этом, например, {1, 2} и {2, 1} - одинаковые сочетания, так как они отличаются только порядком следования элементов.
Решение. Из комбинаторики известна формула:
Не интересуясь вопросом ее вывода и корректности, мы будем использовать тот ее вариант, который написан после второго знака равенства (если смотреть слева направо), так как он наиболее оптимален для вычислений и позволит обойтись двумя циклами (для числителя for с downto, для знаменателя - просто for). Для числителя и знаменателя предусмотрим соответственно переменные num (от англ. numerator - «числитель») и denom (от англ. denominator - «знаменатель»), которым нужно поначалу присвоить значения 1, чтобы осуществить контроль частных случаев (этот вопрос упомянут в предыдущей задаче):
1) При k = 0 переменная num останется неизменной и будет равна 1, так как невозможен вход в цикл с уменьшением от n до (n + 1), переменная denom будет равна 1 как 0!;
2) При n = k num и denom будут вычислены и при делении дадут единицу;
3) При n = k = 0 переменная denom будет вычислена как 0!, а переменная num не изменится по невозможности входа в цикл с уменьшением от 0 до 1.
Код:
1. program NumOfCombinations; 2. 3. var 4. i, n, k: byte; 5. num, denom: integer; 6. 7. begin 8. readln(n, k); 9. num := 1; 10. for i := n downto n - k + 1 do begin 11. num := num * i 12. end; 13. denom := 1; 14. for i := 1 to k do begin 15. denom := denom * i 16. end; 17. writeln(num div denom) 18. end. |
Задача № 30. Вывести таблицу квадратов и кубов всех натуральных чисел до n
Формулировка. Дано натуральное число n, меньшее 256. Используя псевдографику, вывести на экран таблицу квадратов и кубов всех натуральных чисел от 1 до n включительно.
Примечание: псевдографика - это совокупность символов для формирования видимых графических примитивов (линий, прямоугольников, рамок, таблиц и т. д.). Она была актуальна в те далекие времена, когда устройства вывода компьютеров не способны были работать с графикой, либо это было проблематично.
Символы, использующиеся для псевдографики, должны быть включены в набор используемого в терминале (консоли) компьютерного шрифта.
Решение. В этой задаче мы впервые займемся графическим оформлением выходных данных программы. Для начала подумаем, как может выглядеть таблица в простейшем случае (n = 3):
x |
x2 |
x3 |
|
123 |
149 |
1827 |
Несмотря на то, что кодовые страницы для DOS имеют определенный набор символов для рисования графических примитивов, в частности, таблиц, мы будем пользоваться лишь символами '-' и '|' для построения линий таблицы, а также '/' и '\' для формирования ее угловых элементов.
Построим псевдографический эквивалент этой таблицы:
/-----------------------\
| x | x^2 | x^3 |
|-----------------------|
| 1 | 1 | 1 |
| 2 | 4 | 8 |
| 3 | 9 | 27 |
\-----------------------/
Примечание: в случае ограниченных возможностей вывода для обозначения возведения выражения в степень используется постфикс «^k», где k - показатель степени. Кстати, здесь мы выравниваем значения в середине столбцов, сдвигая к середине разряд единиц упорядоченных по правому краю столбцов.
Как же сформировать вывод на экран такой таблицы? Понятно, что это нужно сделать построчно. Однако какой ширины сделать таблицу и как организовать вывод строк со степенями? Так как максимальное число, которое может быть подано на вход - 255, и его куб равен 16581375 (он состоит из 8 цифр), то нам нужно сделать колонки ширины 1 + 8 + 8 + 1 = 18 (крайние единицы для отступов) символов, чтобы таблица выглядела равномерно:
/--------------------------------------------------------\
| x | x^2 | x^3 |
|--------------------------------------------------------|
| 1 | 1 | 1 |
| 2 | 4 | 8 |
|... |... |... |
|255 | 65025 | 16581375 |
\--------------------------------------------------------/
Как видим, при постепенном увеличении числа будут «вырастать» справа налево. Чтобы вывести такую строку, нужно вывести константу '|', затем вывести соответствующее число с шириной поля вывода 9, потом вывести константу '|' с шириной поля вывода 10 и аналогично вывести оставшиеся колонки:
writeln('|', i:9, '|':10, i * i:9, '|':10, i * i * i:9, '|':10);
Схематически с учетом форматирования это будет выглядеть так:
'|255 | 65025 | 16581375 |'
Изменение цветов соответствует чередованию аргументов в операторе вывода.
Так как заголовок таблицы один и тот же для всех вариантов исходных данных, мы можем сразу вывести его с помощью трех строковых констант через writeln:
writeln('/--------------------------------------------------------\');
writeln('| x | x^2 | x^3 |');
writeln('|--------------------------------------------------------|');
После вывода всех строк нужно вывести нижнюю границу таблицы:
writeln('\--------------------------------------------------------/');
Вообще, все эти константы и правила не взялись «просто так» или из расчетов. Единственный использованный факт - разрядность числа не более 8, поэтому мы и взяли ширину колонок «по максимуму». В остальном нужно было экспериментировать, чтобы найти наиболее легкое и наглядное решение. Конечно, псевдографика - это не алгоритмическое программирование, и в нем тестирование и эксперимент играют чуть ли не самую важную роль.
Код:
1. program MyTable; 2. 3. var 4. i, n: byte; 5. 6. begin 7. readln(n); 8. writeln('/--------------------------------------------------------\'); 9. writeln('| x | x^2 | x^3 |'); 10. writeln('|--------------------------------------------------------|'); 11. for i := 1 to n do begin 12. writeln('|', i:9, '|':10, i * i:9, '|':10, i * i * i:9, '|':10) 13. end; 14. writeln('\--------------------------------------------------------/') 15. end. |
Задача № 31. Сформировать реверсную запись заданного числа
Формулировка. Дано натуральное число n заранее неизвестной разрядности. Сформировать и вывести на экран число, представляющее собой реверсную запись n.
Решение. Это более общий случай задачи 4, в которой при случае трехзначного n отчетливо видны повторяющиеся фрагменты кода. Попытаемся получить общий алгоритм решения через цикл.
Пусть дано число 25893. Возьмем его последнюю цифру как остаток от деления на 10 - это 3. Очевидно, она должна быть первой. Отбросим ее у числа n и возьмем последнюю цифру 9 - она должна быть второй. Чтобы сформировать две цифры реверсного числа, умножим 3 на 10 и прибавим 9, потом добавим третью цифру и т. д.
Так как разрядность числа неизвестна, мы будем использовать цикл с предусловием. Его тело будет выглядеть так:
r := r * 10;
r := r + n mod 10;
n := n div 10;
Поначалу результат r должен быть равен 0, и тогда умножение нуля на 10 в первом шаге не разрушает формирование реверсной записи, которое теперь может быть заключено в один цикл.
Каким же будет условие продолжения? Нетрудно понять, что когда мы будем добавлять последнюю оставшуюся цифру исходного числа n к реверсной записи r, мы умножим r на 10, прибавим к ней как n mod 10 (в данном случае этот остаток равен n) и разделим n на 10. Тогда n станет равно 0 и цикл должен закончиться, так что условие его продолжения - n < > 0.
Код:
1. program ReverseOfN; 2. 3. var 4. r, n: word; 5. 6. begin 7. readln(n); 8. r := 0; 9. while n <> 0 do begin 10. r := r * 10; 11. r := r + n mod 10; 12. n := n div 10 13. end; 14. writeln(r) 15. end. |
Задача № 32. Проверить монотонность последовательности цифр числа
Формулировка. Дано натуральное число n. Проверить, представляют его ли цифры его восьмеричной записи строго монотонную последовательность. При этом последовательность из одной цифры считать строго монотонной.
Примечание: в математике строго возрастающие и строго убывающие последовательности называются строго монотонными. В строго возрастающей последовательности каждый следующий член больше предыдущего. Например: 1, 3, 4 ,7, 11, 18. В строго убывающей последовательности каждый следующий член меньше предыдущего. Например: 9, 8, 5, 1.
Решение. Здесь нам нужно будет последовательно получить разряды восьмеричной записи числа, двигаясь по записи числа справа налево. Как мы уже знаем, последний разряд числа в восьмеричной системе счисления есть остаток от деления этого числа на 8.
Попытаемся определить несколько общих свойств строго возрастающих (обозначим пример как 1) и строго убывающих (обозначим как 2) последовательностей (для наглядности будем сразу брать восьмеричные последовательности):
1) 3, 4, 5, 8, 9, 11.
2) 8, 7, 3, 2, 0.
Для начала введем в рассмотрение некоторую формулу, обозначим ее как (I):
deltai = ai - ai+1,
где ai - член заданной последовательности с индексом i. Нетрудно понять, что эта формула определяет разность между двумя соседними элементами: например, если i = 5 (то есть, мы рассматриваем пятую разность), то формула будет выглядеть так: delta5 = a5 - a6. При этом стоит учитывать множество всех значений, которые может принимать i. Например, для последовательности (1) i может принимать значения от 1 до 5 включительно, для последовательности (2) - от 1 до 4 включительно. Легко проверить, что для всех других i формула (I) не имеет смысла, так как в ней должны участвовать несуществующие члены последовательности.
Найдем все deltai для последовательности (1): delta1 = 3 - 4 = -1, delta2 = 4 - 5 = -1, delta3 = 5 - 8 = -3, delta4 = 8 - 9 = -1, delta5 = 9 - 11 = -2.
Как видим, они все отрицательны. Нетрудно догадаться, что это свойство сохраняется для всех строго возрастающих последовательностей.
Выпишем все deltai для последовательности (2), не расписывая при этом саму формулу: 1, 4, 1, 2. Видим, что все они положительны.
Кстати, весьма примечательно, что в математическом анализе определение монотонной функции дается в терминах, подобных используемым в нашей формуле (I), которая рассматривается там несколько более гибко, а deltai при этом называется приращением и имеет несколько иное обозначение.
Можно обобщить сказанное тем, что последовательность приращений показывает, на какую величину уменьшается каждый член исследуемой последовательности чисел, начиная с первого. Понятно, что если каждый член числовой последовательности уменьшается на положительную величину, то эта последовательность строго убывает и т. д.
Из всех этих рассуждений делаем вывод о том, что числовая последовательность является строго монотонной (то есть, строго возрастающей или строго убывающей) тогда и только тогда, когда deltai имеют один и тот же знак для всех i. Таким образом, мы вывели понятие, которое можно проверить с помощью последовательности однотипных действий, то есть, циклической обработки.
Теперь нам необходимо попробовать унифицировать проверку знакопостоянства всех delta для последовательностей обоих видов. Для этого рассмотрим произведение каких-либо двух delta в последовательностях (1) и (2). Примечательно, что оно положительно как произведение чисел одного знака. Таким образом, мы можем в любой последовательности взять delta1 и получить произведения его со всеми остальными delta (обозначим эту формулу как (II)):
p = delta1 * deltai
Если все p положительны, то последовательность строго монотонна, а если же возникает хотя бы одно отрицательное произведение p, то условие монотонности нарушено.
Теперь перенесем эти рассуждения из математики в программирование и конкретизируем их на последовательность цифр восьмеричной записи числа. Обозначим идентификатором delta результат вычисления формулы (I) для двух текущих соседних членов последовательности.
Каким же образом двигаться по разрядам числа n и обрабатывать все delta?
Сначала мы можем получить последнюю цифру числа n (назовем ее b), отбросить ее и получить предпоследнюю цифру n (назовем ее a), отбросить ее тоже, а затем вычислить delta = a - b. Кстати, отметим, что при таком подходе мы будем для всех i находить deltai, двигаясь по ним справа налево. Начальному фрагменту этих действий соответствует следующий код:
b := n mod 8;
n := n div 8;
a := n mod 8;
n := n div 8;
delta:= a - b;
Теперь мы можем войти в цикл с предусловием n < > 0. В каждом шаге цикла мы должны присвоить переменной b число a, затем считать следующий разряд в a и отбросить этот разряд в n. Таким способом мы «сдвигаем» текущую пару: например, на 1-ом шаге в примере (2) мы до входа в цикл использовали бы цифры 2 (в переменной a) и 0 (в переменной b), затем при входе в цикл скопировали бы 2 в b и 3 в a - таким образом, все было бы готово для исследования знака по произведению. В связи с этим основной цикл будет выглядеть так:
while n <> 0 do begin
b := a;
a := n mod 8;
n := n div 8;
...
end;
На месте многоточия и будет проверка знакопостоянства произведений. Воспользовавшись формулой (II), мы заменим deltai в качестве текущего на саму разность a - b, чтобы не задействовать дополнительную переменную. В итоге, если теперь delta * (a - b) <= 0, то выходим из цикла:
if delta * (a - b) <= 0 then break;
Теперь рассмотрим развитие событий по завершении цикла:
1) Если произойдет выход по завершению цикла, то есть «закончится» число в связи с превращением его в 0 на некотором шаге, то значения a, b и delta будут содержать значения, подтверждающие строгую монотонность последовательности, что можно проверить с помощью вывода значения булевского выражения на экран.
2) Если в теле цикла произошел выход через условный оператор, то эти переменные будут содержать значения, с помощью которых выявлено условие нарушения строгой монотонности. Это значит, что по выходе из цикла ответ можно выводить в формате:
writeln(delta * (a - b) > 0);
Код:
1. program OctalSequence; 2. 3. var 4. n, a, b: word; 5. delta: integer; 6. 7. begin 8. readln(n); 9. b := n mod 8; 10. n := n div 8; 11. a := n mod 8; 12. n := n div 8; 13. delta := a - b; 14. while n <> 0 do begin 15. b := a; 16. a := n mod 8; 17. n := n div 8; 18. if delta * (a - b) <= 0 then break 19. end; 20. writeln(delta * (a - b) > 0) 21. end. |
Кстати, что будет при вводе числа n, меньшего 8, ведь его восьмеричная запись однозначна? Хотя наша цепочка делений еще до входа в цикл требует двух цифр в записи числа!
Посмотрим, как поведет себя программа при вводе числа n из единственной цифры k: сначала k идет в b (строка 9), затем отбрасывается в n (строка 10), которое теперь равно 0, затем в a идет число 0, так как 0 mod 8 = 0 (строка 11). При этом строка 12 уже ничего не дает, так как n, которое сейчас равно нулю, присваивается значение 0 div 8 = 0. Далее вычисляется delta = -k (строка 13), затем игнорируется цикл, так как n = 0 (строки 14 - 19), затем выводится на экран значение выражения -k * -k > 0 (строка 20), которое истинно для любого действительного k кроме нуля, который и не входит в условие нашей задачи, так как n натуральное.
Как видим, вырожденный случай прошел обработку «сам собой» и для него не пришлось разветвлять программу, что выражает несомненный плюс.
Задача № 33. Получить каноническое разложение числа на простые сомножители
Формулировка. Дано натуральное число n (n > 1). Получить его каноническое разложение на простые сомножители, то есть представить в виде произведения простых сомножителей. При этом в разложении допустимо указывать множитель 1. Например, 264 = 2 * 2 * 2 * 3 * 11 (программе допустимо выдать ответ 264 = 1 * 2 * 2 * 2 * 3 * 11).
Решение. Данная задача имеет достаточно красивое решение.
Из основной теоремы арифметики известно, что для любого натурального числа больше 1 существует его каноническое разложение на простые сомножители, причем это разложение единственно с точностью до порядка следования множителей. То есть, например, 12 = 2 * 2 * 2 и 12 = 3 * 2 * 2 - это одинаковые разложения.
Рассмотрим каноническую форму любого числа на конкретном примере. Например, 264 = 2 * 2 * 2 * 3 * 11. Каким образом можно выявить эту структуру? Чтобы ответить на этот вопрос, вспомним изложенные в любом школьном курсе алгебры правила деления одночленов, представив, что числа в каноническом разложении являются переменными. Как известно, если разделить выражение на переменную в некоторой степени, содержащуюся в этом выражении в той же степени, оно вычеркивается в ее записи.
То есть, если мы разделим 264 на 2, то в его каноническом разложении уйдет одна двойка. Затем мы можем проверить, делится ли снова получившееся частное на 2. Ответ будет положительным, но третий раз деление даст остаток. Тогда нужно брать для рассмотрения следующее натуральное число 3 - на него частное разделится один раз. В итоге, проходя числовую прямую в положительном направлении, мы дойдем до числа 11, и после деления на 11 n станет равно 1, что будет говорить о необходимости закончить процедуру.
Почему при таком «вычеркивании» найденных сомножителей мы не получим делимостей на составные числа? На самом деле, здесь все просто - любое составное число является произведением простых сомножителей, меньших его. В итоге получается, что мы вычеркнем из n все сомножители любого составного числа, пока дойдем до него самого в цепочке делений. Например, при таком переборе n никогда не разделится на 4, так как «по пути» к этому числу мы вычеркнем из n все сомножители-двойки.
Алгоритм на естественном языке:
1) Ввод n;
2) Присвоение переменной p числа 2;
3) Вывод числа n, знака равенства и единицы для оформления разложения;
4) Запуск цикла с предусловием n < > 1. В цикле:
1. Если m mod p = 0, то вывести на экран знак умножения и переменную p, затем разделить n на p, иначе увеличить значение i на 1;
Код:
1. program PrimeFactors; 2. 3. var 4. n, p: word; 5. 6. begin 7. readln(n); 8. p := 2; 9. write(n, ' = 1'); 10. while n <> 1 do begin 11. if (n mod p) = 0 then begin 12. write(' * ', p); 13. n := n div p 14. end 15. else begin 16. inc(p) 17. end 18. end 19. end. |
Подобные документы
Запись кодов команд программы и констант в FlashROM, кодов исходных данных в EEPROM, требуемых значений установочных битов (Fuse Bits) и битов защиты (Lock Bits). Запись и чтение кодов при программировании, способы программирования в микроконтроллерах.
контрольная работа [24,2 K], добавлен 22.08.2010Теоретические и практические аспекты решения прикладных задач с применением функций и процедур структурного (модульного) программирования. Особенности разработки схемы алгоритма и программы для вычисления массива z на языке Turbo Pascal 7.0, их описание.
курсовая работа [241,7 K], добавлен 11.12.2009Запись в языке программирования – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. Поле записи как обычная переменная. Операторы сравнения, присоединения. Программа с использованием массива структур.
реферат [11,5 K], добавлен 19.01.2009Изучение функций и возможностей среды разработки языка программирования Pascal. Рассмотрение работы с одномерными и двумерными массивами, со строками и числами. Математическая формулировка задач. Разработка алгоритмов, описание структуры программ.
курсовая работа [879,8 K], добавлен 11.02.2016Характеристика вычислительной системы и инструментов разработки. Программирование на языке Pascal в среде Turbo Pascal и на языке Object Pascal в среде Delphi. Использование процедур, функций, массивов, бинарного поиска. Создание базы данных в виде файла.
отчет по практике [2,1 M], добавлен 02.05.2014Составление структурных программ для решения практических задач по теме "Целочисленная арифметика". Алгоритм нахождения делителей натурального числа, алгоритм проверки простое ли число, алгоритм Решета Эратосфена. Система программирования Free Pascal.
разработка урока [27,1 K], добавлен 03.09.2014Решение задач с помощью языка программирования Delphi: вычисление значения функции Y от X; систем двух уравнений; прогрессий; последовательностей; вычисление числа с определенной точностью; перевод числа из десятичной в восьмеричную систему счисления.
отчет по практике [83,8 K], добавлен 08.06.2010Pascal - высокоуровневый язык программирования общего назначения и интегрированная среда разработки программного обеспечения для платформ DOS и Windows. Входная информация, требуемая для решения задачи и принятые обозначения; описание алгоритма.
курсовая работа [259,6 K], добавлен 18.01.2011Решение трансцендентного уравнения методом Ньютона. Построение графика функции. Блок-схема алгоритма решения задачи и программа решения на языке Pascal. Вычисление значения интеграла методом трапеции, блок-схема алгоритма, погрешности вычисления.
задача [163,4 K], добавлен 16.12.2009Решения задачи графическим и программным способами. Описание алгоритма решения графическим способом, укрупненная схема алгоритма. Ввод элементов двумерного массива, вывод преобразованного массива, разработка программы на языке pascal, листинг программы.
курсовая работа [115,5 K], добавлен 22.05.2010Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.
контрольная работа [150,4 K], добавлен 03.05.2014Файл - именованная область памяти на магнитном носителе. Программирование доступа к файлу в языке Turbo Pascal. Описание файловой переменной. Виды файлов в зависимости от способа описания: текстовые, двоичные или типизированные и нетипизированные.
реферат [14,8 K], добавлен 19.01.2009Способы сортировки задач программирования: пузырьком, пузырьковая с просеиванием, метод последовательного поиска минимумов, вставками. Распределяющая сортировка - RadixSort-цифровая - поразрядная. Теория чисел. Простые числа. Задача "Красивые числа".
реферат [90,5 K], добавлен 14.05.2008Разработка алгоритма работы устройства, описание выбора элементной базы и работы принципиальной схемы. Текст программы, инициализация указателя стека, структура системы и ресурсов микроконтроллера. Запись кодов при программировании данного устройства.
контрольная работа [18,4 K], добавлен 24.12.2010Основные понятия и структура обработчика на языке Pascal. Элективные курсы по информатике в системе профильного обучения. Элективный курс "Программирование в среде Delphi". Методические материалы по изучению программирования на языке Object Pascal.
методичка [55,4 K], добавлен 08.12.2010Этапы подготовки и решения реальных задач. Словесно-формульное, графическое описание, псевдокоды. Программа нахождения квадрата числа на языке Бейсик. Разветвляющийся и циклический алгоритм. Общие положения программирования. Базовые конструкции.
презентация [308,3 K], добавлен 31.10.2016Составление программы на алгоритмическом языке Turbo Pascal. Разработка блок-схемы алгоритма её решения. Составление исходной Pascal-программы и реализация вычислений по составленной программе. Применение методов Рунге-Кутта и Рунге-Кутта-Мерсона.
курсовая работа [385,0 K], добавлен 17.09.2009Понятие о стохастическом программировании, М-постановка и Р-постановка целевой функции. Описание этапов решения задач стохастического программирования: предварительный, оперативный анализ стохастической модели, переход к детерминированному эквиваленту.
курсовая работа [63,2 K], добавлен 15.06.2010Изучение понятия и основных задач стеганографии - науки, изучающей способы и методы сокрытия информации. Характеристика метода замены наименее значащих битов для bmp файлов. Реализация метода замены НЗБ для bmp файлов на языке программирования Java.
курсовая работа [149,2 K], добавлен 13.02.2013Разработка алгоритмов методом пошаговой детализации. Типы данных и операции в Turbo-Pascal. Организация работы с подпрограммами. Составление алгоритмов и программ задач с использованием конечных сумм. Организация работы с динамическими переменными.
учебное пособие [1,4 M], добавлен 26.03.2014