Задачи с использованием циклов (PascalABC.NET): различия между версиями
(Новая страница: «== Факториал == Факториалом натурального числа n! называется произведение всех членов нат...») |
|||
Строка 38: | Строка 38: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
5050 | 5050 | ||
+ | |||
+ | == Выбрать только нужные числа из диапазона == | ||
+ | Среди целых чисел из интервала [a;b] выбрать те, которые кратны трем и оканчиваются цифрой 9. Найти сумму отобранных чисел и их среднее значение. | ||
+ | |||
+ | Простейший алгоритм – перебрать все числа из интервала в цикле for, «просеяв» их через указанный набор условий. Накопить в переменной s сумму отобранные чисел, а в переменной k – их количество. Среднее значение m найти как отношение s / k. Значения a и b будем вводить с клавиатуры. Перед выполнением цикла полагаем s = 0, k = 0. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | ## | ||
+ | var (a, b) := ReadInteger2('Введите границы интервала:'); | ||
+ | var (s, k) := (0, 0); | ||
+ | for var i := a to b do | ||
+ | if (i mod 3 = 0) and (Abs(i) mod 10 = 9) then | ||
+ | (s, k) := (s + i, k + 1); | ||
+ | Print('Сумма', s, ' среднее', s / k); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Введите границы интервала: -39 217 | ||
+ | Сумма 645 среднее 71.6666666666667 | ||
+ | |||
+ | Чтобы сделать алгоритм эффективнее, можно найти в начале заданного интервала число, кратное 3 и затем каждый раз прибавлять к нему по 3, обеспечивая кратность трем для всех получаемых значений. При этом проверять нужно будет только равенство девяти последней цифры в числе. Конечно, при этом мы не можем использовать цикл for, изменяющий счетчик на единицу, но у нас есть while. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | ## | ||
+ | var (a, b) := ReadInteger2('Введите границы интервала:'); | ||
+ | if a mod 3 <> 0 then | ||
+ | a := a > 0 ? a + 3 - a mod 3 : a - a mod 3; | ||
+ | var (s, k, d) := (0, 0, a); | ||
+ | while d <= b do | ||
+ | begin | ||
+ | if Abs(d) mod 10 = 9 then | ||
+ | (s, k) := (s + d, k + 1); | ||
+ | d += 3; | ||
+ | end; | ||
+ | Print('Сумма', s, ' среднее', s / k); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Сумма кубов == | ||
+ | Найти сумму кубов всех целых чисел от 30 до 120. | ||
+ | |||
+ | Общий член последовательности чисел ak = k<sup>3</sup>, где k = 30, 31, … 120. Идеальная задача для цикла for. Тип данных – integer, поскольку 120<sup>3</sup> ≪ 2.1 миллиарда. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | ## | ||
+ | var s := 0; | ||
+ | for var k := 30 to 120 do | ||
+ | s += k * k * k; | ||
+ | Print(s); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 52518375 | ||
+ | |||
+ | == Вычисление суммы ряда дробей == | ||
+ | Вычислить сумму 2/3 + 3/4 + 4/5 + … + 20/21. | ||
+ | |||
+ | Построим формулу для общего члена последовательности. В числителях – натуральные числа от 2 до 20, в знаменателях – натуральные числа, на единицу большие, чем в числителях. a<sub>k</sub> = k / (k + 1), где k = 2, 3, … 20. Снова цикл for с целыми k, а вот сами значения ak будут иметь тип real. | ||
+ | |||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | ## | ||
+ | var s := 0.0; // чтобы тип был real | ||
+ | for var k := 2 to 20 do | ||
+ | s += k / (k + 1); | ||
+ | Print(s); | ||
+ | </syntaxhighlight> | ||
+ | 16.8546412952373 |
Версия 15:55, 11 мая 2023
Факториал
Факториалом натурального числа n! называется произведение всех членов натурального ряда чисел от 1 до n включительно. Найти и вывести значения факториала 4-х чисел введённых пользователем.
Организуем цикл с количеством повторений, равным четырем. Для очередного введенного n вычисляется и выводится значение n!. С учетом вычисления 100! используем тип real.
1 ##
2 loop 4 do // 4 раза вводим значения n
3 begin
4 var n := ReadInteger('n =');
5 var p := 1.0;
6 for var i := 1 to n do
7 p *= i;
8 Writeln(n, '! = ', p)
9 end.
n = 5 5! = 120 n = 10 10! = 3628800 n = 20 20! = 2.43290200817664E+18 n = 100 100! = 9.33262154439441E+157
Cумму первых ста чисел натурального ряда
Найти сумму первых ста чисел натурального ряда.
Пример задачи, которую нужно решать на калькуляторе. Или на бумажке, «в столбик». Натуральный ряд чисел – арифметическая прогрессия, у которой первый член и разность равны единице. Формула для нахождения суммы n членов арифметической прогрессии в данном случае приводится к выражению 0.5∙(1 + 100)∙100, значение которого равно 5050. Учителя предлагают школьникам эту задачу, требуя использовать циклы и демонстрируя тем самым, что программисту не следует думать над тем, как составлять алгоритм. На их месте я бы давал оба подхода. Используем цикл for, поскольку количество повторений известно, а в теле цикла нужно последовательно получать значения ряда чисел 1, 2, 3, … n и суммировать их.
1 ##
2 var s := 0;
3 for var i := 1 to 100 do
4 s += i;
5 Print(s);
5050
Выбрать только нужные числа из диапазона
Среди целых чисел из интервала [a;b] выбрать те, которые кратны трем и оканчиваются цифрой 9. Найти сумму отобранных чисел и их среднее значение.
Простейший алгоритм – перебрать все числа из интервала в цикле for, «просеяв» их через указанный набор условий. Накопить в переменной s сумму отобранные чисел, а в переменной k – их количество. Среднее значение m найти как отношение s / k. Значения a и b будем вводить с клавиатуры. Перед выполнением цикла полагаем s = 0, k = 0.
1 ##
2 var (a, b) := ReadInteger2('Введите границы интервала:');
3 var (s, k) := (0, 0);
4 for var i := a to b do
5 if (i mod 3 = 0) and (Abs(i) mod 10 = 9) then
6 (s, k) := (s + i, k + 1);
7 Print('Сумма', s, ' среднее', s / k);
Введите границы интервала: -39 217 Сумма 645 среднее 71.6666666666667
Чтобы сделать алгоритм эффективнее, можно найти в начале заданного интервала число, кратное 3 и затем каждый раз прибавлять к нему по 3, обеспечивая кратность трем для всех получаемых значений. При этом проверять нужно будет только равенство девяти последней цифры в числе. Конечно, при этом мы не можем использовать цикл for, изменяющий счетчик на единицу, но у нас есть while.
1 ##
2 var (a, b) := ReadInteger2('Введите границы интервала:');
3 if a mod 3 <> 0 then
4 a := a > 0 ? a + 3 - a mod 3 : a - a mod 3;
5 var (s, k, d) := (0, 0, a);
6 while d <= b do
7 begin
8 if Abs(d) mod 10 = 9 then
9 (s, k) := (s + d, k + 1);
10 d += 3;
11 end;
12 Print('Сумма', s, ' среднее', s / k);
Сумма кубов
Найти сумму кубов всех целых чисел от 30 до 120.
Общий член последовательности чисел ak = k3, где k = 30, 31, … 120. Идеальная задача для цикла for. Тип данных – integer, поскольку 1203 ≪ 2.1 миллиарда.
1 ##
2 var s := 0;
3 for var k := 30 to 120 do
4 s += k * k * k;
5 Print(s);
52518375
Вычисление суммы ряда дробей
Вычислить сумму 2/3 + 3/4 + 4/5 + … + 20/21.
Построим формулу для общего члена последовательности. В числителях – натуральные числа от 2 до 20, в знаменателях – натуральные числа, на единицу большие, чем в числителях. ak = k / (k + 1), где k = 2, 3, … 20. Снова цикл for с целыми k, а вот сами значения ak будут иметь тип real.
1 ##
2 var s := 0.0; // чтобы тип был real
3 for var k := 2 to 20 do
4 s += k / (k + 1);
5 Print(s);
16.8546412952373