题目
思路
本题的关键在于弄清楚行数和每行应该打印的符号的个数;
(1)首先求出应该打多少行和打完剩余的个数,这里我设定的参数是n为除沙漏中间一行外两边增加的行数,即总行数=2n+1;
(2)通过数列的知识不难求出在给定的符号数量下n的最大值,有了这个层数数据后,再找出每一层应该打的符号数量和层数i的关系;
(3)这里我将其分为上面的n层和下面的n-1层,对于上下的任意一层第i层,都有先打印n-i-1个空格,再打印2i+1个符号的关系;注意每一行的左边打出空格即可,右边不需要打;
#include<stdio.h>
int main(void)
{
int a, n;
char c;
scanf("%d %c", &a, &c);
for (n = 1; 1 + 2 * (n + 1) * (n - 1) <= a; n++);//n为除去中间后两侧增加的层数,即总层数=2*n+1
n = n - 1;
a = a - (1 + 2 * (n + 1) * (n - 1));//a用来存放剩余符号的个数
for (int i = n - 1; i >= 0; i--)
{
for (int j = 0; j < n - i-1; j++)
printf(" ");
for (int j = 0; j < 2 * i + 1; j++)
printf("%c", c);
printf("\n");
}
for (int i = 1; i <= n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
printf(" ");
for (int j = 0; j < 2 * i + 1; j++)
printf("%c", c);
printf("\n");
}
printf("%d", a);
return 0;
}