1. 程式人生 > >PAT乙級1027 列印沙漏

PAT乙級1027 列印沙漏

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

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:
19 *
輸出樣例:
*****
 ***
  *
 ***
*****
2
#include<stdio.h>
//n   M
//1   1
//2   6			M=2*n*n-1
//3   17

int main(void)
{
	int n = 0, M = 0;
	char c;
	scanf("%d %c", &M, &c);
	while (2 * n*n - 1 <= M)
		n++;
	n--;	//n是沙漏的上半部分的層數
	
	for (int i = n; i > 0; i--)
		{
			for (int j = 1; j <= n - i; j++)
			{
				printf(" ");
			}
			for (int k = 1; k <= 2 * i - 1; k++)
			{
				printf("%c", c);
				M--;
			}
			printf("\n");
		}
	for (int i = 1; i <= n - 1; i++)
	{
		for (int j = 1; j <= n - 1 - i; j++)
		{
			printf(" ");
		}
		for (int k = 1; k <= 2 * i + 1; k++)
		{
			printf("%c", c);
			M--;
		}
		printf("\n");
	}
	printf("%d", M);
	return 0;
}