鱼C论坛

 找回密码
 立即注册
查看: 1058|回复: 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++代码示例:
#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;
}

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

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

使用道具 举报

发表于 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;
}

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

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 19:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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