鱼C论坛

 找回密码
 立即注册
查看: 720|回复: 2

[已解决]求助一下

[复制链接]
发表于 2023-10-19 08:48:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

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

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

这题用C或者C++怎么做
最佳答案
2023-10-19 08:48:48
这道题可以使用C++来解决。首先,我们需要找到符号数最大的沙漏的行数。我们可以使用一个循环来递减符号数,直到剩余的符号数不足以组成下一行。然后,我们再使用一个循环来递增符号数,打印出剩余的沙漏形状。

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

  1. #include <iostream>
  2. using namespace std;

  3. int main() {
  4.     int N; // 输入的符号数
  5.     char symbol; // 输入的符号
  6.     cin >> N >> symbol;

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

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

  14.     // 打印符号数最大的沙漏
  15.     for (int i = maxRows; i >= 1; i--) {
  16.         for (int j = 0; j < maxRows - i; j++) {
  17.             cout << " ";
  18.         }
  19.         for (int j = 0; j < 2 * i - 1; j++) {
  20.             cout << symbol;
  21.             remainSymbols--;
  22.         }
  23.         cout << endl;
  24.     }

  25.     // 打印符号数递增的沙漏
  26.     for (int i = 2; i <= maxRows; i++) {
  27.         for (int j = 0; j < maxRows - i; j++) {
  28.             cout << " ";
  29.         }
  30.         for (int j = 0; j < 2 * i - 1; j++) {
  31.             cout << symbol;
  32.             remainSymbols--;
  33.         }
  34.         cout << endl;
  35.     }

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

  37.     return 0;
  38. }
复制代码


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

希望对你有帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-19 08:48:48 | 显示全部楼层    本楼为最佳答案   
这道题可以使用C++来解决。首先,我们需要找到符号数最大的沙漏的行数。我们可以使用一个循环来递减符号数,直到剩余的符号数不足以组成下一行。然后,我们再使用一个循环来递增符号数,打印出剩余的沙漏形状。

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

  1. #include <iostream>
  2. using namespace std;

  3. int main() {
  4.     int N; // 输入的符号数
  5.     char symbol; // 输入的符号
  6.     cin >> N >> symbol;

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

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

  14.     // 打印符号数最大的沙漏
  15.     for (int i = maxRows; i >= 1; i--) {
  16.         for (int j = 0; j < maxRows - i; j++) {
  17.             cout << " ";
  18.         }
  19.         for (int j = 0; j < 2 * i - 1; j++) {
  20.             cout << symbol;
  21.             remainSymbols--;
  22.         }
  23.         cout << endl;
  24.     }

  25.     // 打印符号数递增的沙漏
  26.     for (int i = 2; i <= maxRows; i++) {
  27.         for (int j = 0; j < maxRows - i; j++) {
  28.             cout << " ";
  29.         }
  30.         for (int j = 0; j < 2 * i - 1; j++) {
  31.             cout << symbol;
  32.             remainSymbols--;
  33.         }
  34.         cout << endl;
  35.     }

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

  37.     return 0;
  38. }
复制代码


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

希望对你有帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-19 08:49:57 | 显示全部楼层
问题分析:

要打印沙漏形状,需要确定每行的符号个数以及打印的行数。根据题目描述,沙漏的符号数从大到小顺序递减到1,再从小到大顺序递增,并且相邻两行符号数差2。因此,可以先确定沙漏的行数,然后计算每行的符号个数。

解决思路:

1. 接收输入的符号个数和符号类型。
2. 确定沙漏的行数row,使得总符号数满足条件:符号个数 >= 2*row^2-1
3. 根据沙漏的行数row,计算每行前面空格的个数、符号的个数以及剩余符号的个数。
4. 按照沙漏形状打印符号。
5. 输出剩余的符号个数。

C++代码实现:
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int main() {
  5.   int n, row, symbolCount, spaces;
  6.   char symbol;
  7.   cin >> n >> symbol;
  8.   
  9.   row = floor(sqrt((n + 1) / 2.0)); // 计算沙漏的行数
  10.   symbolCount = 2 * row * row - 1; // 沙漏中的符号总个数
  11.   
  12.   spaces = 0; // 前面的空格个数
  13.   for (int i = row - 1; i >= 0; i--) {
  14.     for (int j = 0; j < spaces; j++) {
  15.       cout << " ";
  16.     }
  17.     spaces++;
  18.     for (int j = 0; j < 2 * i + 1; j++) {
  19.       cout << symbol;
  20.       symbolCount--;
  21.     }
  22.     cout << endl;
  23.   }
  24.   
  25.   spaces -= 2;
  26.   for (int i = 1; i < row; i++) {
  27.     for (int j = 0; j < spaces; j++) {
  28.       cout << " ";
  29.     }
  30.     spaces--;
  31.     for (int j = 0; j < 2 * i + 1; j++) {
  32.       cout << symbol;
  33.       symbolCount--;
  34.     }
  35.     cout << endl;
  36.   }
  37.   
  38.   cout << n - symbolCount << endl; // 输出剩余的符号个数
  39.   
  40.   return 0;
  41. }
复制代码

C代码实现:
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main() {
  4.   int n, row, symbolCount, spaces;
  5.   char symbol;
  6.   scanf("%d %c", &n, &symbol);
  7.   
  8.   row = floor(sqrt((n + 1) / 2.0)); // 计算沙漏的行数
  9.   symbolCount = 2 * row * row - 1; // 沙漏中的符号总个数
  10.   
  11.   spaces = 0; // 前面的空格个数
  12.   for (int i = row - 1; i >= 0; i--) {
  13.     for (int j = 0; j < spaces; j++) {
  14.       printf(" ");
  15.     }
  16.     spaces++;
  17.     for (int j = 0; j < 2 * i + 1; j++) {
  18.       printf("%c", symbol);
  19.       symbolCount--;
  20.     }
  21.     printf("\n");
  22.   }
  23.   
  24.   spaces -= 2;
  25.   for (int i = 1; i < row; i++) {
  26.     for (int j = 0; j < spaces; j++) {
  27.       printf(" ");
  28.     }
  29.     spaces--;
  30.     for (int j = 0; j < 2 * i + 1; j++) {
  31.       printf("%c", symbol);
  32.       symbolCount--;
  33.     }
  34.     printf("\n");
  35.   }
  36.   
  37.   printf("%d\n", n - symbolCount); // 输出剩余的符号个数
  38.   
  39.   return 0;
  40. }
复制代码

代码实现中使用了sqrt()函数计算平方根,floor()函数向下取整。根据输入的符号个数n,通过计算求得沙漏的行数row,然后按照沙漏形状打印符号,并输出剩余的符号个数。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表