程序设计团队天梯赛L1-002 打印沙漏(分数 20)
题目类型:简单模拟
题目内容:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
解题思路:
由输入输出样例可知符号和空格是交替输出的,尝试过提交后可知每一行的符号后面均没有空格
,故需要算出每一行的符号个数以及空格数然后交替输出,而至于剩余的符号个数则在输出符号时进行统计
,然后与总个数相减即可。
实现代码如下:
#include<iostream>
using namespace std;
int main()
{
//n为符号总数;j为循环变量;sum为统计量;x为用掉符号的个数
int n,a[1000]={0},j=0,sum=0,x=0;
cin>>n;
char m; //m为输入的的符号
cin>>m;
//使用for循环将每一行的字符个数存入数组a[]中
//终止条件:sum达到打印沙漏符号个数的一半
//因为沙漏每一行符号个数与上一行个数都是相差2,所以i=i+2
for(int i=1;sum<=(n-1)/2;)
{
a[j]=i;
i=i+2;
sum=sum+i;
j++;
}
//交替输出上半部分符号和空格
for(int i=j-1;i>=0;i--)
{
for(int l=0;l<j-i-1;l++)//l为输出的空格数
{
cout<<' ';
}
for(int k=a[i];k>0;k--)//k为输出的符号个数
{
cout<<m;
x++; //x为统计用掉的符号数
}
cout<<endl; //打印完一行
}
//交替输出下半部分符号和空格
for(int i=1;i<=j-1;i++)
{
for(int l=j-1;l>i;l--)
{
cout<<' ';
}
for(int k=a[i];k>0;k--)
{
cout<<m;
x++;
}
cout<<endl;
}
cout<<n-x<<endl; //输出符号剩余个数
return 0;
}
提交结果如下:
总结:
本题可以使用简单的模拟控制符号和空格的个数来实现,也可以找到打印沙漏上下两部分的规律、前后的规律来实现,各位可以自行尝试,本人较懒故选择了较为直白的方法:直接输出。