【问题描述】编写一个程序,输入一个正整数N,在屏幕上用@,打印以N为边长的正六边形。
【输入形式】输入一个正整数N。
【输出形式】屏幕上输出以N为边长的正六边形。
【样例输入】
4
【样例输出】
* @@@@
* @ @
* @ @
* @ @
* @ @
* @ @
* @@@@
【样例说明】输入的为一个正整数,打印输出一个以这个正整数为边长的正六边形。
说明:由于系统会自动去掉行首的空格,因此本题目打印时,每一行应先输出一个'*'字符。
需要的结果:
3
* @@@
* @ @3
* @ @
* @ @3
* @@@
5
* @@@@@
* @ @5
* @ @
* @ @
* @ @
* @ @9
* @ @
* @ @
* @@@@@
4
* @@@@
* @ @4
* @ @
* @ @
* @ @6
* @ @
* @@@@
代码展示:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int m=n;
//正六边形上半部分
for(int i=1;i<=n;i++)
{
//处理开始的*和空格
cout << "*";
for(int j=i;j<=n;j++) cout << ' ';
//进行判断:如果是上边打印n*@
if(i==1)
{
for(int k=1;k<=n;k++) cout << "@";
cout << endl;
}
//不是上边就打印@+m个空格+@,并且下一次循环m+=2
else
{
cout << "@";
for(int k=1;k<=m;k++) cout << ' ';
cout << "@" << endl;
m+=2;
}
}
//正六边形下半部分
//先定义一下中间我们需要打印的空格
//我们可以观察一下,如果n=3,那他的下半部分中间开始空格为3
//n=4时,下半部分中间开始空格为6 n=5时下半部分中间开始空格为9
//通过观察发现n=3,4,5..... 中间空格开始满足等差数列3n-6
int t = 3*n-6;
for(int i=n-1;i>=1;i--)
{
//下半部分开始*和空格
cout << "*";
for(int j=n-i+1;j>=1;j--) cout << ' ';
//如果达到了下边,打印n*@;
if(i==1)
{
for(int k=1;k<=n;k++) cout << "@";
cout << endl;
}
//打印下边的@+t*空格+@,并且下一次循环t-=2
else
{
cout << "@";
for(int k=1;k<=t;k++) cout << ' ';
cout << "@" << endl;
t-=2;
}
}
return 0;
}