问题分析:
要打印沙漏形状,需要确定每行的符号个数以及打印的行数。根据题目描述,沙漏的符号数从大到小顺序递减到1,再从小到大顺序递增,并且相邻两行符号数差2。因此,可以先确定沙漏的行数,然后计算每行的符号个数。
解决思路:
1. 接收输入的符号个数和符号类型。
2. 确定沙漏的行数row,使得总符号数满足条件:符号个数 >= 2*row^2-1。
3. 根据沙漏的行数row,计算每行前面空格的个数、符号的个数以及剩余符号的个数。
4. 按照沙漏形状打印符号。
5. 输出剩余的符号个数。
C++代码实现:#include <iostream>#include <cmath>using namespace std;int main() { int n, row, symbolCount, spaces; char symbol; cin >> n >> symbol; row = floor(sqrt((n + 1) / 2.0)); // 计算沙漏的行数 symbolCount = 2 * row * row - 1; // 沙漏中的符号总个数 spaces = 0; // 前面的空格个数 for (int i = row - 1; i >= 0; i--) { for (int j = 0; j < spaces; j++) { cout << " "; } spaces++; for (int j = 0; j < 2 * i + 1; j++) { cout << symbol; symbolCount--; } cout << endl; } spaces -= 2; for (int i = 1; i < row; i++) { for (int j = 0; j < spaces; j++) { cout << " "; } spaces--; for (int j = 0; j < 2 * i + 1; j++) { cout << symbol; symbolCount--; } cout << endl; } cout << n - symbolCount << endl; // 输出剩余的符号个数 return 0;}
C代码实现:#include <stdio.h>#include <math.h>int main() { int n, row, symbolCount, spaces; char symbol; scanf("%d %c", &n, &symbol); row = floor(sqrt((n + 1) / 2.0)); // 计算沙漏的行数 symbolCount = 2 * row * row - 1; // 沙漏中的符号总个数 spaces = 0; // 前面的空格个数 for (int i = row - 1; i >= 0; i--) { for (int j = 0; j < spaces; j++) { printf(" "); } spaces++; for (int j = 0; j < 2 * i + 1; j++) { printf("%c", symbol); symbolCount--; } printf("\n"); } spaces -= 2; for (int i = 1; i < row; i++) { for (int j = 0; j < spaces; j++) { printf(" "); } spaces--; for (int j = 0; j < 2 * i + 1; j++) { printf("%c", symbol); symbolCount--; } printf("\n"); } printf("%d\n", n - symbolCount); // 输出剩余的符号个数 return 0;}
代码实现中使用了sqrt()函数计算平方根,floor()函数向下取整。根据输入的符号个数n,通过计算求得沙漏的行数row,然后按照沙漏形状打印符号,并输出剩余的符号个数。
球一个最佳答案谢谢啦!这对我非常重要! |