|
发表于 2023-10-19 08:49:57
|
显示全部楼层
问题分析:
要打印沙漏形状,需要确定每行的符号个数以及打印的行数。根据题目描述,沙漏的符号数从大到小顺序递减到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,然后按照沙漏形状打印符号,并输出剩余的符号个数。
球一个最佳答案谢谢啦!这对我非常重要!   |
|