思路:

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;
}