Вывести первые n членов треугольной последовательности - Turbo Pascal
Формулировка задачи:
Дана монотонная последовательность, в которой каждое натуральное число k встречается ровно k раз: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...
По данному натуральному n выведите первые n членов этой последовательности. Попробуйте обойтись только одним циклом for.
Входные данные
Вводится натурально число n.
Выходные данные
Выведите ответ на задачу.
Примеры
входные данные
2
выходные данные
1 2
входные данные
5
выходные данные
1 2 2 3 3
Решение задачи: «Вывести первые n членов треугольной последовательности»
textual
Листинг программы
//рекурсивная процедура вывода чисел ряда
//k-число n-количество выводимых чисел
procedure vyvod(k,n:integer);
begin
if n>0 then
begin
write(k,' ');
vyvod(k,n-1);
end;
end;
var n,k,q,i:integer;
a:real;
begin
write('n=');
readln(n);
//найдем ближайшее треугольное число сверху
a:=(-1+sqrt(1+8*n))/2;//из формулы Tn=n*(n+1)/2
if frac(a)=0 then k:=trunc(a)
else k:=trunc(a)+1;
q:=0;
for i:=1 to k-1 do
begin
vyvod(i,i);
q:=q+i;
end;
vyvod(k,n-q);
end.
Объяснение кода листинга программы
- В начале кода объявляются переменные n, k, q и i, а также переменная a типа real.
- Затем происходит чтение значения переменной n с помощью функции readln.
- Находится ближайшее треугольное число сверху с помощью формулы Tn=n*(n+1)/2. Если дробная часть этого числа равна нулю, то k присваивается целая часть числа, иначе k присваивается целая часть плюс единица.
- Переменная q инициализируется значением 0.
- Затем происходит цикл for, который выполняется от 1 до k-1. Внутри цикла вызывается рекурсивная процедура vyvod, которая выводит текущее значение i и все предыдущие значения i. Значение i увеличивается на 1 на каждой итерации цикла.
- После завершения цикла for вызывается последняя итерация vyvod с аргументами k и n-q.
- Конец программы.