思路:
1:首先确定打印的沙漏的行数。根据输入的符号数量N确定符合题意的最大的沙漏形状。沙漏形状可以视为两个颠倒重合的三角形,根据等差数列求和可知对行数为n的两个颠倒重合的三角形,符号个数为2 * n * n-1,设n初值为1,将该公式作为判断条件使用while循环,找到第一个使符号个数大于N的n,然后让n--便得到符合题意的n,计算剩余没用的符号数x,然后根据n计算沙漏行数。
2:逐行输出沙漏图形。沙漏的第一行没有空格,此后的每一行输出的空格数逐次+1。每行输出的符号数等于沙漏的行数(n)减去输出的空格数。当输出的符号数为1的时候,从那一行往后的行输出的空格数逐次-1。
3:输出剩余没用的符号数x。
#include<stdio.h>
int main()
{
int i,j,k,n,N,x,w=0;
char c;
scanf("%d %c",&N,&c);
n=0;
//寻找第一个使符号个数大于N的n
while((2*n*n-1)<=N)
n++;
n--;
//计算剩余没用的符号数x
x=N-2*n*n+1;
//计算沙漏行数
n=n*2-1;
//逐行输出沙漏图形
for(i=0,k=0;i<n;i++)
{
//输出空格
for(j=0;j<k;j++)
printf(" ");
//输出符号
for(j=0;j<(n-2*k);j++)
printf("%c", c);
printf("\n");
//判断输出符号数是否为1
if((n-2*k)==1)
w=1;
//如果没有到输出1个符号的那行每行输出空格数逐次+1,否则-1
if(w==0)
k++;
else
k--;
}
//输出剩余没用的符号数x
printf("%d",x);
return 0;
}