Решение задач. День тринадцатый. Задачи for16-24


for16-24

Приветствуем читателей нашего сайта! Сегодня мы с вами решим задачи for16-24.

For16°. Дано вещественное число A и целое число N (> 0). Используя один цикл, вывести все целые степени числа A от 1 до N.

Заводим специальную переменную, в которую будем записывать новое значение степени.

program for16;

var
  A, Pow: real;
  N, i: integer;

begin
  write('Введите A и N: ');
  read(A, N);
  Pow := 1;
  for i := 1 to N do 
  begin
    Pow := Pow * A; // Умножаем предыдущее число на А
    writeln(A, ' в ', i, ' степени равно ', Pow);
  end;
end.

For17. Дано вещественное число A и целое число N (> 0). Используя один цикл, найти сумму 1 + A + A2 + A3 + … + AN.

Модифицированная версия for16. В этой задаче мы не выводим значения степеней сразу, а складываем их в отдельную переменную.

program for17;

var
  A, Pow, Sum: real;
  N, i: integer;

begin
  write('Введите A и N: ');
  read(A, N);
  Pow := 1;
  Sum := 1;
  for i := 1 to N do 
  begin
    Pow := Pow * A; // Узнаем следующую степень числа А
    Sum := Sum + Pow; // Увеличиваем сумму на эту степень
  end;
write('Сумма 1 +... + A в степени N равно ', Sum);
end.

For18. Дано вещественное число A и целое число N (> 0). Используя один цикл, найти значение выражения 1 – A + A2 – A3 + … + (–1)N·AN. Условный оператор не использовать.

Используем дополнительную переменную, например, Z. Присваиваем значение -1 и каждый цикл умножаем значение степени на Z.

program for18;

var
  A, Pow, Sum: real;
  N, i, Z: integer;

begin
  write('Введите A и N: ');
  read(A, N);
  Pow := 1;
  Sum := 1;
  Z := -1; // Присваиваем -1
  for i := 1 to N do 
  begin
    Pow := Pow * A;
    Pow := Z * Pow; // Умножаем значение степени.
    Sum := Sum + Pow;
  end;
write('Сумма равна ', Sum);
end.

For19°. Дано целое число N (> 0). Найти произведение N! = 1·2·…·N (N–факториал). Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и вывести его как вещественное число.

Каждую итерацию цикла умножаем factorial на i.

program for_19;

var
  factorial: real;
  i, N: integer;

begin
  read(N);
  factorial := 1; // По определению 0! = 1
  for i := 1 to N do factorial := factorial * i;
  write(factorial);
end.

For20°. Дано целое число N (> 0). Используя один цикл, найти сумму 1! + 2! + 3! + … + N! (выражение N! — N–факториал — обозначает произведение всех целых чисел от 1 до N: N! = 1·2·…·N). Чтобы избежать целочисленного переполнения, проводить вычисления с помощью вещественных переменных и вывести результат как вещественное число.

Получая новое значение факториала, суммируем его со всеми предыдущими значениями.

program for_20;

var
  factorial, sum_factorial: real;
  i, N: integer;

begin
  read(N);
  factorial := 1; 
  sum_factorial := 1; // По определению 0! = 1
  for i := 1 to N do 
  begin
    factorial := factorial * i; // Узнаем фокториал
    sum_factorial := sum_factorial + factorial; // Суммируем
  end;
  write('Сумма факториалов - ', sum_factorial);
end.

For21. Дано целое число N (> 0). Используя один цикл, найти сумму 1 + 1/(1!) + 1/(2!) + 1/(3!) + … + 1/(N!) (выражение N! — N–факториал — обозначает произведение всех целых чисел от 1 до N: N! = 1·2·…·N). Полученное число является приближенным значением константы e = exp(1).

Задача аналогична предыдущей, только на этот раз мы делим единицу на значение факториала, и после этого складываем их.

program for_21;

var
  factorial, sum_factorial: real;
  i, N: integer;

begin
  read(N);
  factorial := 1;
  sum_factorial := 1;
  for i := 1 to N do 
  begin
    factorial := factorial * i;
    sum_factorial := sum_factorial + 1 / factorial; // Делим 1 на факториал
  end;
  writeln('Сумма факториалов, деленных на 1 = ', sum_factorial, ' = ', Exp(1)); // Проверка программы.
end.

For22. Дано вещественное число X и целое число N (> 0). Найти значение выражения 1 + X + X2/(2!) + … + XN/(N!) (N! = 1·2·…·N). Полученное число является приближенным значением функции exp в точке X.

program for_22;

var
  factorial, sum_factorial, x: real;
  i, N, b: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите x: ');
  readln(x);
  b := x;
  factorial := 1;
  sum_factorial := 1;
  for i := 1 to N do 
  begin
    factorial := factorial * i; // Узнаем факториал
    sum_factorial := sum_factorial + x / factorial; // Складываем, деля х на факториал
    x := x * b; // возводим значение х в следующую степень
  end;
  writeln('Сумма факториалов, деленных на X в степенях = ', sum_factorial, ' = ', Exp(x)); // проверка
end.

For23. Дано вещественное число X и целое число N (> 0). Найти значение выражения X – X3/(3!) + X5/(5!) – … + (–1)N·X2·N+1/((2·N+1)!) (N! = 1·2·…·N). Полученное число является приближенным значением функции sin в точке X.

Я решил, что лучше высчитывать каждую степень х и каждый факториал, а затем проверять i на четность.

program for_23;

var
  factorial, sum_factorial, x, xs: real;
  i, N, z: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите x: ');
  readln(x);
  factorial := 1;
  sum_factorial := 0; // начальное значение на этот раз не 1.
  z := -1;
  xs := 1; // значение степени х
  for i := 1 to 2 * N + 1 do 
  begin
    factorial := factorial * i; // значение факториала
    xs := xs * x;  // степень х
    if i mod 2 <> 0 then // проверяем нечетность i  
    begin
     z := -z; // меняем знак z
     sum_factorial := sum_factorial + z * (xs / factorial);
    end;
  end;
  writeln('Сумма факториалов = ', sum_factorial, ' = ', sin(x)); //проверка
end.

For24. Дано вещественное число X и целое число N (> 0). Найти значение выражения 1 – X2/(2!) + X4/(4!) – … + (–1)N·X2·N/((2·N)!) (N! = 1·2·…·N). Полученное число является приближенным значением функции cos в точке X.

Аналогична предыдущей задачи.

program for_24;

var
  factorial, sum_factorial, x: real;
  i, N, z: integer;

begin
  write('Введите N: ');
  readln(N);
  write('Введите x: ');
  readln(x);
  factorial := 1;
  sum_factorial := 1; // стартовое значение снова 1
  z := 1;
  for i := 1 to 2 * N do 
  begin
    factorial := factorial * i;
    if i mod 2 = 0 then 
    begin
      z := -z; 
      x := x * x;
      sum_factorial := sum_factorial + z * (x / factorial);
    end;
  end;
  writeln('Сумма факториалов = ', sum_factorial, ' = ', cos(x)); // проверка
end.

Все! Сегодня были непростые задачи, но я надеюсь, что вы справились. Если у вас возникли вопросы пишите нам сюда или в комментарии, которые расположены чуть ниже.

  1. В 22 ошибка в решении, а конкретно x := sqr(x); // возводим значение х в квадрат.
    Здесь необходимо перед циклом сделать b:=x, а вместо x := sqr(x) написать x:=x*b;

  2. Спасибо за нахождение ошибки.
    Исправил. Если найдёте ещё, обязательно напишите 🙂

  3. Теперь когда b:=x нужно поменять тип переменной b, потому как нельзя преобразовать тип real к типу integer.

  4. Задание 20. Ошибка
    В строке
    for i := 1 to N do
    переменной i присвоить значение 2

  5. В 20 задании ошибка в вычислениях.
    Окончательный результат больше всегда больше на 1 единицу.
    Вы задали sum_factorial = 1 изначально из- за того, что 0!=1, когда нужно было sum_factorial=0, ибо в самом задании ни чего не сказано о 0!, там сразу начинается с 1!.

  6. в 24 исправьте
    21. строка ( x := x * x;) убрать
    22. строка
    sum_factorial := sum_factorial + z * (power(x, i) / factorial);

  7. Более простое решение 16 номера:

    var a: real;
    n: integer;
    begin
    readln (a, n);
    for var t := 1 to n do
    print (power (a, t))
    end.

    Зачем учили нас функциям и процедурам, если сами их особо не используете?)

  8. Аналогично 17 задача:

    var a, res: real;
    n: integer;
    begin
    res := 0;
    readln (a, n);
    for var t := 0 to n do
    res := res + (power (a, t));
    write (res)
    end.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *