#include <stdio.h>
void out(int n, int m, char c) {
int i;
for (i=0; i<(n-m)/2; i++) printf(" ");
for (i=0; i<m; i++) printf("%c", c);
//for (i=0; i<(n-m)/2; i++) printf(" "); //之前错在这,不要输出多余空格
printf("\n");
} //函数作用:打印一行符号,其中m个符号c,n-m个空格
int main()
{
int n, m, sum=1, i;
char c;
scanf("%d %c", &n, &c);
for(i=3; sum<=n; i+=2) sum+=i*2;
m=i-4; //计算出最上层*的个数,即沙漏的宽度m
//printf("%d %d\n", m, sum); //测试代码
for (i=m; i>1; i-=2) out(m, i, c); //输出沙漏上半部分
for (i=1; i<=m; i+=2) out(m, i, c); //输出沙漏下三角
printf("%d\n", n-(sum-2*(m+2))); //打印多余的*个数
}
1、主要有两点,一是计算出沙漏的宽度,二是将沙漏的形式打印出来。这里采用模拟沙漏的层数增加方式来计算宽度,写了一个函数来逐行打印沙漏。
2、这题有一个坑就是沙漏右边区域的空格不要打印出来,即不要输出多余空格,画蛇添足。