7-1 打印沙漏


题目描述:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

解题思路:

? 此题要求我们打印一个沙漏,由观察得:就是打印两个等腰三角形,但是要求一正一反,并且有一个公用的顶点。

? 题目要求输入一个整数n和一个符号,要求我们用该符号打印沙漏,但是符号的数量不超过n。

? 如果一个等腰三角形的高度为h,那么构成等腰三角形所需的符号的个数为h2。那么构成数字沙漏的符号的个数就是h2*2-1。(多了一个顶点)

? 我们可以用一个for循环枚举可能的高度,再进行判断是否符合条件。若高度为h,则所需的符号数量的最小值为2h2-1,最大值为2(h+1)2-2(若为2*(h+1)2-1则可以构成等腰三角形高度为h+1的数字沙漏)。然后再分别输出两个等腰三角形,注意两个等腰三角形有公共顶点。

代码:

#include 
#include 
using namespace std;
int main() 
{
	int n, lef, high;
	char arr;
	cin >> n >> arr;
    
for (high = 1;; high++)
{
	int min = 2 * high * high - 1;
	int max = 2 * (high + 1) * (high + 1) - 2;
	if (n >= min && n <= max)//判断n是否符合构成数字沙漏的条件
	{
		lef = n - min;//求出剩余的符号个数
		break;
	}
}

for (int i = 1; i <= high; i++)//输出倒立等腰三角形
{
	for (int j = 1; j <=high*2-i; j++)
	{
		if (i > j)
		{
			cout << ' ';
		}
		else
		{
			cout << arr;
		}
	}
	cout << endl;
}

for (int i = 2; i <= high; i++)//输出正立等腰三角形,注意有公共顶点,高度从2开始
{
	for (int j = 1; j <= high - i; j++)
	{
		cout << ' ';
	}
	for (int j = 1; j <= 2 * i - 1; j++)
	{
		cout << arr;
	}
	cout << endl;
}
cout << lef;
return 0;
}

相关