给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
C语言实现
#include <stdio.h>
#include <math.h>
int main() {
int n;
char tmp, c;
scanf("%d%c%c", &n, &tmp, &c);
// 求出上三角一共有多少行
int rows = sqrt((n + 1) / 2);
// 求出第一行符号个数, 即一行最多符号个数
int cnt_c_org = 2 * rows - 1;
int cnt_c = cnt_c_org;
int cnt_space = 0;
int delta_c, delta_s;
// 定义符号和空白个数的增量
delta_c = 2, delta_s = 1;
while (cnt_c <= cnt_c_org) {
for (int i = 0; i < cnt_space; ++i) {
printf("%c", ' ');
}
for (int i = 0; i < cnt_c; ++i) {
printf("%c", c);
}
printf("\n");
// 当符号个数为1时,增量取反
if (cnt_c == 1) {
delta_c = -2;
delta_s = -1;
}
cnt_c -= delta_c;
cnt_space += delta_s;
}
// 输出剩余符号个数
printf("%d", n - 2 * rows * rows + 1);
return 0;
}
思路
1.沙漏由一个三角形和一个少顶点的三角形组成。设完整三角形有行,每行的个数为1, 3, 5, 7,...,是等差数列.
,
。所以沙漏中符号个数为
. 已知符号个数为t,则完整三角形的行数为
.
2.观察图形可知,打印沙漏,就要打印空白符号和标记符号,每增加一行,空白符号先加后减,增量绝对值为1.标记符号先减后加,增量绝对值为2. 当标记符号输出一个时,增量符号发生变化。