yangzhixiaohuli 发表于 2023-10-19 08:48:00

求助一下

7-1 打印沙漏
分数 9
作者 陈越
单位 浙江大学
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:
*****
***
*
***
*****
2

这题用C或者C++怎么做

isdkz 发表于 2023-10-19 08:48:48

这道题可以使用C++来解决。首先,我们需要找到符号数最大的沙漏的行数。我们可以使用一个循环来递减符号数,直到剩余的符号数不足以组成下一行。然后,我们再使用一个循环来递增符号数,打印出剩余的沙漏形状。

下面是一个解决这个问题的C++代码示例:

#include <iostream>
using namespace std;

int main() {
    int N; // 输入的符号数
    char symbol; // 输入的符号
    cin >> N >> symbol;

    int maxRows = 1; // 最大的沙漏行数
    int remainSymbols = N; // 剩余未使用的符号数

    // 找到符号数最大的沙漏的行数
    while (2 * maxRows * maxRows - 1 <= remainSymbols) {
      maxRows++;
    }
    maxRows--;

    // 打印符号数最大的沙漏
    for (int i = maxRows; i >= 1; i--) {
      for (int j = 0; j < maxRows - i; j++) {
            cout << " ";
      }
      for (int j = 0; j < 2 * i - 1; j++) {
            cout << symbol;
            remainSymbols--;
      }
      cout << endl;
    }

    // 打印符号数递增的沙漏
    for (int i = 2; i <= maxRows; i++) {
      for (int j = 0; j < maxRows - i; j++) {
            cout << " ";
      }
      for (int j = 0; j < 2 * i - 1; j++) {
            cout << symbol;
            remainSymbols--;
      }
      cout << endl;
    }

    cout << remainSymbols << endl; // 输出剩余未使用的符号数

    return 0;
}


这段代码首先读取输入的符号数和符号。然后,使用一个循环找到符号数最大的沙漏的行数。接下来,使用两个嵌套循环打印符号数最大的沙漏和符号数递增的沙漏,并同时更新剩余未使用的符号数。最后,输出剩余未使用的符号数。

希望对你有帮助!

Mike_python小 发表于 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,然后按照沙漏形状打印符号,并输出剩余的符号个数。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 求助一下