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;
}
打印沙漏 天梯赛L1-002
最新推荐文章于 2022-12-14 15:55:38 发布