```c
include
int main() {
int n, i, j, sum;
char c;
scanf("%d %c", &n, &c);
// 计算组成沙漏的最大个数
i = 1;
sum = 1;
while (sum <= n) {
sum += 2 * (2 * i - 1);
i++;
}
i = i - 1;
// 打印沙漏的上半部分
for (j = 0; j < i; j++) {
for (i = 0; i < j; i++) {
printf(" ");
}
for (i = 0; i < 2 * (i + 1) - 1; i++) {
printf("%c", c);
}
printf("\n");
}
// 打印沙漏的下半部分
for (j = 2; j <= i; j++) {
for (i = 0; i < i - j; i++) {
printf(" ");
}
for (i = 0; i < 2 * j - 1; i++) {
printf("%c", c);
}
printf("\n");
}
// 打印剩余的符号
printf("%d\n", n - (sum - 2 * (2 * (i + 1) - 1)));
return 0;
}
```
代码解释:
输入部分
使用`scanf`函数读取一个整数`n`和一个字符`c`,分别表示沙漏的符号数和符号类型。
计算沙漏的最大个数
通过循环计算出能够组成沙漏的最大符号数`sum`,并确定沙漏的中间行数`i`。
打印沙漏的上半部分
使用嵌套循环打印上半部分的沙漏,注意每行的空格数和符号数。
打印沙漏的下半部分
使用嵌套循环打印下半部分的沙漏,注意每行的空格数和符号数。
打印剩余的符号
计算并打印剩余的符号数。
示例运行:
假设输入为`17 *`,程序将输出如下沙漏形状:
```
*
*
*
*
*
*
*
*
*
```
你可以根据需要修改输入的符号数和符号类型来测试不同的情况。