用了一个比较笨的总结数学规律的方法实现的,大致思路如下:
根据题目可知这是一个上下对称的图形,最中间的一行 * 的个数为输入的层数,整个图形可以理解为以输入层数为边长的正方形,空格和 * 分别占每一行的一个单位,每一行共n个单位,当输出的第x层为最中间时,的个数为n个,并且我们发现第一层为1个,第二层为3个,也就是随着层数,的个数为加2的等差数列。那么每一层两侧分别的空格数为n减去所在层数的数除以2,所在层数的数可以通过循环来建立等差数列进行计算。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,num; \\ n 为层数,num为最中间*的个数
cin >> n;
num = n;
int m; \\ m为下班部分图形的代换层数
if(n == 1) \\ 当n为1时不存在上下两个对称部分,所以单独列出
{
cout << "*" <<endl;
return 0;
}
for(int i = 1 ; i < n; ) \\ 上半层 * 的个数来循环直到中间层
{
m = i; \\ 让m在最后获取到中间层上一层的*数
for (int j = 1; j <= (num - i) / 2; j++ ) \\ 计算每一行前半部分的空格数
{
cout << " ";
}
for (int k = (num - i) / 2 + 1; k <= n - (num - i) /2; k++)
\\ 从前半部分的空格数结束之后的后一个位置开始循环,直到*的最后一个位置结束
\\ (num - i)/2为后半部分空格的数量,由n减去后半部分空格数量则为*的最后位置
{
cout<< "*";
}
for(int z = n - (num - i) / 2 + 1; z <= n; z ++)
\\ 从*结束的后一个位置开始循环输出空格,直到空格和*的总数达到n
{
cout << " ";
}
cout << endl;
i = i + 2;
}
for(int j = 0; j < n; j++) \\ 循环输出最中间层的*
{
cout << "*";
}
cout << endl;
for(int i = m; i >= 0;)
\\ 因为下半部分图形是上半部分的对称,所以采取反方向递减来输出,让下半层第一层的点数从中间层上一层的点数开始递减
{
\\ 空格和*的计算输出方式和上半层一样,主要通过层数和*数来影响
for (int j = 1; j <= (num - i) / 2; j++ )
{
cout << " ";
}
for (int k = (num - i) / 2 + 1; k <= n - (num - i) /2; k++)
{
cout<< "*";
}
for(int z = n - (num - i) / 2 + 1; z <= n; z ++)
{
cout << " ";
}
cout << endl;
i = i - 2; \\ 以每层减少2 * 来递减
}
return 0;
}
第一次写题解,写的有点儿乱,见谅。