自测-1 打印沙漏 (20分)

自测-1 打印沙漏 (20分)

2020.7.16
自测-1 打印沙漏 (20分)_第1张图片https://pintia.cn/problem-sets/17/problems/type/7

思路分析:
可以发现,沙漏的形状从1个字符,分别向上和向下生成,生成第二个沙漏的时候,沙漏顶和沙漏底分别有3个字符,以此类推,生成第三个沙漏时,顶层和底层分别有5个字符,设n为生成沙漏的序列,则沙漏顶层和底层分别有2n-1个字符。
将沙漏分别上下两部分,上部分包含中间的一个字符,设h为上三角的层数,则可以发现,h = n,通过规律的查找,还可以发现,可以构成沙漏的个数为 2nn-1。

总结一下发现的规律:设h为上三角的层数,n为生成沙漏的序列,则有
沙漏顶层= 2n-1
可以构成沙漏的个数(sum)=2nn-1

#include 
using namespace std;
//打印字符的方法 
void print(int a, char b);
//打印行的方法
void printline(int m, char n,int width );//width为该行能输出最大字符的数量

int main()
{
int num;
char ch; 
cin >> num >> ch;
int h = 0;//上三角的层数
//判断能构成沙漏的数量
for(int i = 1; num>=2*i*i-1; i++)
{
h++;
}
//输出上三角(包含中部)
int j =0;
for (j = 0; j < h; j++)//此循环控制上三角层数
{
printline(j,ch,2*h-1);
}
//输出下三角(不含中部)
for(j = h-2; j >= 0; j--)
{
printline(j,ch,2*h-1);
}
cout <<num - (2*h*h-1);
return 0;
}

void print(int a , char b)
{
while(a--) cout << b;
}

void printline(int m, char n, int width)
{
print(m,' ');
print(width - 2*m,n);
cout << endl;
}

总的思想就是,从上到下,分开计算输出,寻找其中的数学规律。

你可能感兴趣的:(自主学习-数据结构与算法,算法)