L1-002 打印沙漏(c++详解)

题目:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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;
}

        

        欢迎各位小伙伴在评论区讨论留言哦! 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值