ALGO-436 算法训练 正六边形

214 阅读1分钟

「这是我参与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;
}

总结

加油吧,少年郎😁