一、题目
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
二、 思路
1、首先要关注输入输出,输入一个整数和字符,所以首先要定义一个int n型和char c型变量。
2、分析沙漏有什么性质及规律,分别定义合适的变量储存沙漏的性质,然后用这些变量表示他们直间的关系。
沙漏的性质有行数(int h),字符总数(int sum),每一行的字符数(int count)。
3、找规律,求出h,sum,count和n之间的关系(求出sum,h,count)。
4、在知道一个沙漏的行数,字符总数以及每一行字符数之后输出一个规则的沙漏就比较容易了。这里可以分为两部分,一部分为上三角,另一部分为下三角。(中间那一行在上在下都可以)
5、输出沙漏,这里需要注意的是找到每一行空格数和字符数的关系。(空格要输出对)
三、代码
#include<iostream>
using namespace std;
int main()
{
int n;
char c;
cin>>n>>c;
int sum=1,h=1,count=1;//sum,h,count分别为字符总数,行数,以及每一行字符数
while(sum<=n)
{
count+=2;
h+=2;
sum+=count*2;
}
//因为while循环结束后sum,h,count都比所要求的多加了一轮,所以要减去一轮
sum-=count*2;
h-=2;
count-=2;
int m=h/2;//m是用于把沙漏分割上下两部分,这里把中间一行分到了下面
//输出上三角
for(int i=0;i<h/2;i++)
{
//找规律注意空格数量
for(int j=0;j<i;j++)
{
cout<<" ";
}
for(int j=0;j<count;j++)
{
cout<<c;
}
count-=2;
cout<<endl;
}
//输出下三角
for(int i=1;i<=m+1;i++)
{
//这里空格数加上每行要输出的字符数的一半多一个等于从第一个空格到对称轴长度
//从而求出每一行的空格数
for(int k=m+1-(count/2+1);k>0;k--)
{
cout<<" ";
}
for(int j=0;j<count;j++)
{
cout<<c;
}
count+=2;
printf("\n");
}
//输出没用掉的字符数
cout<<n-sum<<endl;
return 0;
}
创作不易,如果感到有帮助的话,动动你们的小手点点赞吧^_^