PAT 乙級 1027. 打印沙漏(20)

1027. 打印沙漏(20)

時間限制
200 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
CHEN, Yue

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

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

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

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

輸出格式:

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

輸入樣例:
19 *
輸出樣例:
*****
 ***
  *
 ***
*****
2


#include<cstdio>

using namespace std;

int main()
{
	int n;
	char c;
	while(scanf("%d %c", &n,&c)!=EOF)
	{
		int sum = 1, i = 1;//sum爲實際打印用到的符號
		while (sum <= n)
		{
			i++;
			sum += 2 * (2 * i - 1);
		}
		sum -= 2 * (2 * i - 1);//減去多加的

		int cnt = 2*(i-1)-1;//第一行和最後一行的符號數
		int x = cnt;
		int space = 0;//打印的空格數
		for (; x>1; space++, x -= 2)
		{
			for (int i = 0; i < space; i++)printf(" ");
			for (int i = 0; i < x; i++)printf("%c", c);
			//不用這行代碼,畫蛇添足for (int i = 0; i < space; i++)printf(" ");
			printf("\n");
		}

		for (;x<=cnt;space--,x+=2)
		{
			for (int i = 0; i < space; i++)printf(" ");
			for (int i = 0; i < x; i++)printf("%c", c);
			//不用這行代碼for (int i = 0; i < space; i++)printf(" ");
			printf("\n");
		}
		printf("%d",n-sum);
	}


	return 0;
}


發佈了111 篇原創文章 · 獲贊 44 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章