「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
题目描述
由键盘输入一个自然数n(2<=100) 编程打印如图所示的正六边形(n为边长)。其中每条边上含有n个*号。
输入格式
一行:包含一个正整数n(2<=100)。
输出格式
题目要求的图形。
样例输入
5
样例输出
数据规模和约定
2<=n<=100。从标准输出设备的第一行开始,图形左边顶点靠左边。
思路分析
这是一道简单题,我的思路是先将要输出的图像分解
这个正六边形可以分成上下两部分,以中间一行为界
我将上面n行和中间行下面的n-1行分别处理
第一行和最后一行也可以单独输出,这样子图形被细分为了四个部分
除首尾两行外,其余每行都可以看作是先输出几个空格,再输出一个,再输出几个空格,再输出一个*
第一行和最后一行都是先输出n-1个空格,再输出n个*
然后从第二行到第n行,中间的空格数是i2+1
然后i又从1开始,输出中间行,即第n行以下部分
由于下半部分只有n-1行,除去最后一行单独处理就只有n-2行要先处理
目测观察规律可得,中间需输出的空格数为2(n-i)+1
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n-1;i++) //先输出空格
cout<<' ';
for(int j=1;j<=n;j++) //再输出*
cout<<'*';
cout<<endl; //第一行输出完成
for(int i=2;i<=n;i++)//输出第2行到第n行
{
for(int j=1;j<=n-i;j++)
cout<<' ';
cout<<'*';
for(int j=1;j<=i*2+1;j++)
cout<<' ';
cout<<"*\n"; //再输出一个*
}
for(int i=1;i<=n-2;i++)//i又从1开始,接下来输出中间行以下部分
{
for(int j=1;j<=i;j++)
cout<<' ';
cout<<'*';
for(int j=1;j<=2*(n-i)+1;j++)
cout<<' ';;
cout<<"*\n";
}
for(int j=1;j<=n-1;j++)//开始输出最后一行
cout<<' ';
for(int j=1;j<=n;j++)
cout<<'*';
cout<<endl;
return 0;
}
总结
加油吧,少年郎😁