
Приветствуем читателей нашего сайта! Сегодня мы с вами решим задачи 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.
На сегодня всё! Если у вас возникли вопросы, задавайте их в комментариях. И не забывайте рассказывать о нашем сайте своим друзьям, кликая по эти замечательным круглым кнопочкам, которые расположены чуть-чуть пониже этих строк.
Здравствуйте! Я понимаю, что по задачнику задание for36 подразумевает использование вложенных циклов, но всё же. Зачем использовать вложенные циклы, когда вычисление суммы можно сделать в одно действие?
Добрый вечер, Сергей! Данные задачи помогают набить руку, закрепить основы программирования. Конечно, во многих случаях применять циклы совершенно неразумно — это только увеличит временную сложность программы. Та же история и с массивами. Поэтому если Вы владеете хорошей математической базой — прекрасно, используйте эти навыки 🙂
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.