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

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

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

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

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

输入样例:

19 *
*****
 ***
  *
 ***
*****

输出样例:

*****
 ***
  *
 ***
*****
2

大体思路:先观察一下,对称的(递减然后递增,公差为2.),先算出第一行的(设置一个函数),然后解决空格的问题和对称的问题。对称设置一个flag控制。空格用第一行的数目减去本行的数目/2,因为每两行之间相差2,每两行之间空格以第一行为标准,相差几个2就是几个空格。

#include<iostream>
using namespace std;
int dp(int n,int &m)
{
   
	if(n==1)
	return 1;
	int sum=1;
	int k=1;
	while(sum<n)
	{
   
		m=n-sum;
		k+=2;
		sum+=k*2;
	}
	return k-2;
}
int main()
{
   
	int n,m;
	int flag=0;
	char s;
	scanf("%d %c",&n,&s);
	int line,i,j,k;
	line=j=k=dp(n,m);
	while(k--)
	{
   
		for(i=1;i<=(j-line)/2;i++)
		printf(" ");
		for(i=1;i<=line;i++)
		printf("%c",s);
		puts("");
		if(!flag)
		line-=2;
		else
		line+=2;
		if(line==1)
		flag=1;
	}
	printf("%d",m);
}