题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
题目分析:
本题题意还是很好理解的,就是给我们一个数和一个符号,要我们打印出一个由这个符号组成的最大漏斗并且输出还剩多少个符号没用上。(需要注意打印出来的漏斗是完整的)
解题过程:
第一步、输入数量和符号。
第二步、打印漏斗:
1、把漏斗分为上半部分(上漏斗是个完整的倒三角形)和下半部分(下漏斗是缺了头 的角形)。
2、计算上漏斗的层数,下漏斗层数就 = 上漏斗 - 1。
3、一层一层打印,先打空格,再打符号。
第三步、最后一行输出还剩多少字符未打印(测试点1)。
ac代码:
#include<iostream>
using namespace std;
int main() {
//输入
int n;
char ch;
cin >> n >> ch;
//计算漏斗层数
//这里计算的上半个倒漏斗的层数,下漏斗 就是= 上漏斗 -1
int x = 1; //起始漏斗 (*)
int m = 0;//层数
while (x <= n) {//无漏斗(即0)层数就为0
m++;
x += (((m*2)+1)*2);
}
//打印漏斗
int y = 0;//记录要打印的空格数
for (int i = m; i > 0; i--) {//打印上半漏斗
for(int j = 0; j < y; j++) {//打印空格
cout <<" ";
}
y++;
for(int p = 0; p < (i - 1) * 2 + 1; p++) {//打印漏斗
cout << ch;
n--;// 边打印边减数量,为最后一步做准备
if(p == (i - 1) * 2) {
cout << endl;
}
}
}
y -= 2;
for(int i = 1; i < m; i++) {//打印下半漏斗
for(int j = y; j > 0; j--) {//打印空格
cout << " ";
}
y--;
for(int p = 0; p < i * 2 + 1; p++) {//打印漏斗
cout << ch;
n--;// 边打印边减数量,为最后一步做准备
if(p == i * 2) {
cout << endl;
}
}
}
//最后一行输出还剩多少个字符没打印
cout << n;
return 0;
}
欢迎各位小伙伴在评论区讨论留言哦!