试题 算法训练 正六边形
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
由键盘输入一个自然数n(2<=100) 编程打印如图所示的正六边形(n为边长)。其中每条边上含有n个*号。
输入格式
一行:包含一个正整数n(2<=100)。
输出格式
题目要求的图形。
样例输入
5
样例输出
数据规模和约定
2<=n<=100。从标准输出设备的第一行开始,图形左边顶点靠左边。
样列输出:
分析:以正六边形为例子可以先看前5行,再看后面的4行,前5行每一行前面的空格跟输入数字有关,第一行是全打出星号,后面四行只需要打印第一个和最后一个,倒立过来的思路大差不差。
废话不多说,上代码。
附上代码:
#include<iostream>
using namespace std;
int main()
{
int n, i, j, k;
cin >> n;
int m = n;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n - i; j++)//输出空格
cout << " ";
if (i == 1)//为第一行时打印全部
{
for (k = 1; k <= m; k++)
{
cout << "*";
}
}
else//为其他行时打印第一个和最后一个
{
for (k = 1; k <= m; k++)
{
if (k == 1 || k == m)//判断是否为最后一个和第一个
cout << "*";//是打印星号
else
cout << " ";
}
}
cout << endl;
m = m + 2;//每行是呈二递增
}
int b = n + n - 2 + n - 2;//到了的第一行所含的数量
for (i = 1; i <= n - 1; i++)//打印空格
{
for (k = 1; k <= i; k++)
cout << " ";
if (i == n - 1)//最后一行全输出星号
{
for (k = 1; k <=n; k++)
{
cout << "*";
}
break;
}
for (k = 1; k <= b; k++)
{
if (k == 1 || k == b)
cout << "*";
else
cout << " ";
}
cout << endl;
b -= 2;//呈二递减
}
return 0;
}