Решение задач. День двадцать второй. For36-40


for36-40

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

For36-40

For36°. Даны целые положительные числа N и K. Найти сумму 1K + 2K + … + NK. Чтобы избежать целочисленного переполнения, вычислять слагаемые этой суммы с помощью вещественной переменной и выводить результат как вещественное число.

1-ый вариант решения этой задачи. 

program for36;

var
  N, k, i, j: integer;
  sum, a: real;

begin
  write('Введите k: ');
  readln(k);
  write('Введите N: ');
  readln(N);
  sum := 0; //в начале сумма равна нулю
  for i := 1 to N do
  begin
    a := 1;
    for j := 1 to k do
      a := a * i; //доводим слагаемое до k-ой степени
    sum := sum + a;
  end; 
  write('Сумма: ', sum)
end.

2-ой вариант решения этой задачи. (Для тех, кто любит побыстрее.)

an =
1) 1 * (a2)n/2, если n чётно;
2) a * (a2)n/2, если n нечётно.

Результат буду записывать в r. На каждой итерации цикла я буду умножать а на саму себя (a2 * a2 = a4). Если значение К нечётно, то я умножу конечное значение а на r, которое будет равняться начальному значению a. Если же значение K чётное, то я умножу конечное значение а на r, которое будет равняться 1.

program for36_2; 

var
  N, K, i, K1: integer;
  sum, a, r: real;

begin
  write('Введите K: ');
  readln(K);
  write('Введите N: ');
  readln(N);
  sum := 0; //в начале сумма равна нулю 
  K1 := K;
  for i := 1 to N do
  begin
    a := i;
    if K1 mod 2 <> 0 then r := a else r := 1; //в r будет записываться результат
    while K1 > 1 do
    begin
      K1 := K1 div 2;
      a := a * a;
      if K1 mod 2 <> 0 then r := r * a {даже четное К в конце станет равняться 1, 
      тогда мы и присвоим r значение основания степени}
    end;
    sum := sum + r;
    K1 := K; 
  end; 
  write('Сумма: ', sum)
end.

For37. Дано целое число N (> 0). Найти сумму 11 + 22 + … + NN. Чтобы избежать целочисленного переполнения, вычислять слагаемые этой суммы с помощью вещественной переменной и выводить результат как вещественное число.

program for37;

var
  N, i, j: integer;
  sum, a: real;

begin
  write('Введите N: ');
  readln(N);
  sum := 0; //в начале сумма равна нулю
  for i := 1 to N do
  begin
    a := 1;
    for j :=  1 to i do
      a := a * i; //доводим слагаемое до i-ой степени
    sum := sum + a 
  end; 
  write('Сумма: ', sum)
end.

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

program for38;

var
  N, i, j: integer;
  sum, a: real;

begin
  write('Введите N: ');
  readln(N);
  sum := 0; //в начале сумма равна нулю
  for i := 1 to N do //i изменяется в диапозоне от 1 до N включительно
  begin
    a := 1;
    for j := N downto i do
      a := a * i; //доводим слагаемое до (N - i + 1)-ой степени
    sum := sum + a 
  end; 
  write('Сумма: ', sum)
end.

For39. Даны целые положительные числа A и B (A < B). Вывести все целые числа от A до B включительно; при этом каждое число должно выводиться столько раз, каково его значение (например, число 3 выводится 3 раза).

program for39;

var
  N, i, j, A, B: integer;

begin
  write('Введите A: ');
  readln(A);
  write('Введите B: ');
  readln(B);
  for i := A to B do
  begin
  writeln; //переносим каретку на следующую строку
    for j := i downto 1 do // Например, i = 3, 3 напечатается (3 - 1) + 1 раза
      write(i, ' ')
  end
end.

For40. Даны целые числа A и B (A < B). Вывести все целые числа от A до B включительно; при этом число A должно выводиться 1 раз, число A + 1 должно выводиться 2 раза и т. д.

program for40;

var
  N, i, j, A, B: integer;

begin
  write('Введите A: '); 
  readln(A);
  write('Введите B: '); 
  readln(B);
  for i := A to B do
  begin
  writeln; //переносим каретку на следующую строку
    for j := A to i do // например, i = A + 2. A + 2 напечатается (A + 2 - A) + 1
      write(i, ' ')
  end
end.

На сегодня всё! Если у вас возникли вопросы, задавайте их в комментариях. И не забывайте рассказывать о нашем сайте своим друзьям, кликая по эти замечательным круглым кнопочкам, которые расположены чуть-чуть пониже этих строк.

  1. Здравствуйте! Я понимаю, что по задачнику задание for36 подразумевает использование вложенных циклов, но всё же. Зачем использовать вложенные циклы, когда вычисление суммы можно сделать в одно действие?

  2. Добрый вечер, Сергей! Данные задачи помогают набить руку, закрепить основы программирования. Конечно, во многих случаях применять циклы совершенно неразумно — это только увеличит временную сложность программы. Та же история и с массивами. Поэтому если Вы владеете хорошей математической базой — прекрасно, используйте эти навыки 🙂

  3. For36
    А так нельзя?
    var n, k: integer;
    sum: real;
    begin
    readln (n, k);
    for var r := 1 to n do
    sum := sum + power (r, k);
    write (sum)
    end.

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

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