Поскольку мы можем вычислить, сколько пространства займет вся глубина пирамиды, прежде чем строить ее, мы можем упростить код, выделив один буфер.
Первый слой занимает 2 char
с (один для *
, один для \n
). Затем следующий слой занимает столько же, сколько и предыдущий, плюс n
экземпляров *
и окончательный \n
. Таким образом, общий размер:
f(n) = f(n-1) + n + 1
f(1) = 2
Решение этого рекуррентного уравнения дает нам:
f(n) = n * (n+3) / 2
Теперь мы можем легко написать всю пирамиду:
char * createPyramid(int depth)
{
int i, j;
int size = depth * (depth + 3) / 2;
char * buffer = malloc(size + 1);
char * p = buffer;
for (i = 0; i < depth; ++i) {
for (j = 0; j < i + 1; ++j)
*p++ = '*';
*p++ = '\n';
}
*p = 0;
return buffer;
}
И распечатать за один раз:
int main()
{
int depth = 9;
char * buffer = createPyramid(depth);
puts(buffer);
free(buffer);
return 0;
}
Конечно, обратите внимание, что если вам нужна программа, которая просто печатает пирамиду, вам даже не нужна динамическая память.