1.打印沙漏【數據結構—起步能力自測題】

題目:

  把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印

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

  所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
  給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

  輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

  首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

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

思路:

  首先去除中間一行的一個“”,然後開始計算,從中間到兩邊(一邊爲例,最後直接 ×× 2),從1開始編號,不難看出,行和“”個數的式子: 2n1(2n-1) 然後用一個變量sum計算當前的“*”數量,判斷是否 輸入的n,最後打印出沙漏和 nsumn-sum 即可。

AC代碼:

#include <iostream>
using namespace std;
int main(void)
{
	int n, i = 1, sum = 1;					//i爲上半部分(或下半部分)層數,sum爲一共打印的個數
	char c;
	cout << "請輸入一個數字和一個字符:";
	cin >> n >> c;
	while (sum <= n)
	{
		sum += 2 * (2 * (i + 1) - 1);				//2n-1是一層的個數,乘以2代表兩層一共需要的
		if (sum <= n)
			i++;
	}
	for (int j = 0; j < i; j++)						//打印上半部分
	{
		for (int k = 0; k < j; k++)
			cout << " ";								//打印j-1個空格
		for (int k = 0; k < 2 * (i - j) - 1; k++)
			cout << c;									//打印2*(i-j-1)-1個符號
		cout << endl;								//打印完一行換行
	}
	for (int j = 2; j <= i; j++)					//打印下半部分
	{
		for (int k = 0; k < i - j; k++)
			cout << " ";								//打印i-j個空格
		for (int k = 0; k < 2 * j - 1; k++)
			cout << c;									//打印2*j-1個符號
		cout << endl;								//打印完一行換行
	}
	cout << n - (sum - 2 * (2 * (i + 1) - 1));
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章