求助一下
7-1 打印沙漏分数 9
作者 陈越
单位 浙江大学
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
这题用C或者C++怎么做 这道题可以使用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;
}
这段代码首先读取输入的符号数和符号。然后,使用一个循环找到符号数最大的沙漏的行数。接下来,使用两个嵌套循环打印符号数最大的沙漏和符号数递增的沙漏,并同时更新剩余未使用的符号数。最后,输出剩余未使用的符号数。
希望对你有帮助! 问题分析:
要打印沙漏形状,需要确定每行的符号个数以及打印的行数。根据题目描述,沙漏的符号数从大到小顺序递减到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]