PAT Basic 1027. 列印沙漏(20)(C語言實現)

NO IMAGE

最新內容已釋出在 我的Github Pages, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo

題目

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

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

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

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

輸入格式

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

輸出格式

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

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

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

思路

這簡直就是一道純數學題。

  • M階的沙漏需要用到的字元個數為2M^2-1;
  • 明顯沙漏關於第M行是對稱的,用絕對值寫會簡潔一些。

程式碼

最新程式碼@github,歡迎交流 ^_^

#include <stdio.h>
#define ABS(X) ((X) >= 0 ? (X) : -(X))
int main()
{
char c;
int N, M;
scanf("%d %c", &N, &c);
for(M = 1; 2 * M * M - 1 <= N; M  ) ; M--;   /* determine the size of the sandglass */
/* draw the pyramid */
for(int i = 0; i < 2 * M - 1; i   ){
for(int j = 0; j < M - 1 - ABS(M - 1 - i); j  ) putchar(' ');
for(int j = 0; j < 2 * ABS(M - 1 - i)   1; j  ) putchar(c);
putchar('\n');
}
printf("%d", N - 2 * M * M   1);
return 0;
}