打印沙漏 天梯赛L1-002

L1-002 打印沙漏 (20)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

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

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

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

输入样例:
19 *

输出样例:
*****
 ***
  *
 ***
*****
2
-----------------------------------------------------------------------------------------------------


#include<iostream>
using namespace std;
int getlevel(int all,char ch,int& level)//得到沙漏的层数,并且返回用不完的ch数 
{	
	int number=1;
	int i;
	for(i=1;number<=all;i++)
	{
		number=number+2*(1+2*i);
	}//得到的i就是能够构建的层数-1;
	level=i-1;//能够搭建的层数,指的是双向的
	int use=1;
	for(int i=1;i<level;i++)
	{
		use=use+2*(1+2*i);
	}
	return all-use;//保存了没用完的ch
}

void show(const int level,char ch)
{
	const int width=1+2*(level-1);//得到沙漏的最大宽度 
	
	for(int templevel=level;templevel>1;templevel--)//依次输出每一层 
	{
		int levelch_num=1+2*(templevel-1);
		int halfkong=(width-levelch_num)/2;
		for(int i=1;i<width+1;i++)
		{	
			if(i<=halfkong) 
			cout<<" ";
			if((i>halfkong)&&(i<=width-halfkong))
			cout<<ch;
		}
		cout<<endl;
	}
	for(int i=1;i<width+1;i++)
	{	
		if(i==((width/2)+1))
		cout<<ch;
		if(i<((width/2)+1))
		cout<<" ";
	}//输出最中间一层
	cout<<endl;
	for(int templevel=2;templevel<=level;templevel++)//依次输出每一层 
	{
		int levelch_num=1+2*(templevel-1);
		int halfkong=(width-levelch_num)/2;
		for(int i=1;i<width+1;i++)
		{	
			if(i<=halfkong)
			cout<<" ";
			if((i>halfkong)&&(i<=width-halfkong))
			cout<<ch;
		}
		cout<<endl;
	}
 } 
int main()
{	
	int all;char ch;//输入字符总数以及字符 
	while(!((cin>>all>>ch)&&(all>0)))
	{
		cin.clear();
		while(cin.get()!='\n')continue;
	}//初始化
	if(all==1)
	{
		cout<<ch<<endl;
		cout<<'0';
		return 0;
	}//处理只有一个ch的情况 
	int level;//能够搭建的层数,以及用不完的符号的数目
	const int left=getlevel(all,ch,level);
	show(level,ch);
	cout<<left;	
	return 0;		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值