把输出的图形看成三个部分,假设上部分和下部分分别有t层,则t=3+5+7+9+......,是个等差数列求和,算出来是t^2+2t,乘以2再加上中部分的1个,整理出来总个数就是2*t*t+4*1,用输入的数n减去即可
以输出上部分图形为例,每层先输出空格,以题目给的样例为例,t=2,上部分应该倒着输出,所以第2行有0个空格,第一行有1个空格,第i行有t-i个空格;每行有2*i+1个*,下部分正序输出即可
中部分就是t+1行,由上述规律推出空格数
统计上部分下部分分别的层数时可以从0枚举,根据上面推出的公式算出总共的数目,如果比n大立刻退出,减去一层即为t
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
char c;
cin>>n>>c;
int t;//层数
int sum;
for(t=0;;t++)
{
sum=2*t*t+4*t+1;
if(sum>n) break;
else continue;
}
t--;//超过了所以减一层
//cout<<t;
sum=2*t*t+4*t+1;
/*上部分*/
for(int i=t;i>0;i--)
{
for(int j=0;j<t-i;j++)
{
printf(" ");
}
for(int k=0;k<2*i+1;k++)
{
printf("%c",c);
}
printf("\n");
}
/*中部分*/
int tt=t+1;
for(int j=0;j<tt-1;j++) printf(" ");
printf("%c\n",c);
/*下部分*/
for(int i=1;i<=t;i++)
{
for(int j=0;j<t-i;j++)
{
printf(" ");
}
for(int k=0;k<2*i+1;k++)
{
printf("%c",c);
}
printf("\n");
}
cout<<n-sum;
return 0;
}