Задачи с использованием циклов (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