PAT_B_1027 打印沙漏

題目描述:spa

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

*****
 ***
  *
 ***
*****
所謂「沙漏形狀」,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不必定能正好組成一個沙漏。要求打印出的沙漏能用掉儘量多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
 ***
  *
 ***
*****
2

本人AC代碼:blog

//  PAT_1027_Print

# include <stdio.h>
# include <math.h>

int main(void)
{
	int number;
	char ch;
	int min=1, max;
	int i, j, k;
	int left;
	int val;
	
	scanf("%d %c",&number,&ch);
	
	if (number < 7)
	{
		printf ("%c\n%d",ch,number-1);
		return 0;
	}
	
	// 用數學公式獲得打印的單側行數 K 
	k = (int)sqrt(2*number + 2) - 1;
	left = number - ((k+1)*(k+1)-2)/2; 
	k /= 2;
	
	 //  打印沙漏 由大到小 
	 for (i=k; i>=0; i--) 
	 {
	 	//  每層有多少個* 
	 	val = (2*i+1);
	 	for (j=0; j<k-i; j++)
	 		printf(" ");
	 	for (j=0; j<val; j++)
	 	{
	 		printf("%c",ch);
		 }
		 printf("\n");
	 }
	 //  打印沙漏 由小到大 
	  for (i=1; i<=k; i++) 
	 {
	 	//  每層有多少個* 
	 	val = (2*i+1);
	 	for (j=0; j<k-i; j++)
	 		printf(" ");
	 	for (j=0; j<val; j++)
	 	{
	 		printf("%c",ch);
		 }
		 printf("\n");
	 }
	 printf("%d",left);
	
	return 0;
}

RRR數學

相關文章
相關標籤/搜索