本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個「*」,要求按下列格式打印html
***** *** * *** *****
所謂「沙漏形狀」,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,markdown
再從小到大順序遞增;首尾符號數相等。給定任意N個符號,不必定能正好組成一個沙漏。要求打印出的沙漏能用掉儘量多的符號。spa
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。設計
19 *
code
***** *** * *** ***** 2
5、設計思路:
爲了方便敘述,我先假設用戶須要打印的符號的個數爲N,須要打印的符號是*;htm
1,首先咱們經過觀察該圖案,利用等差數列的求和公式能夠獲得一個規律:第n個圖案所包含*的個數爲2n2-1個;blog
2,而後根據用戶輸入的N來判斷最多能夠打印第幾個完整圖案,例如,若是用戶輸入19,那麼令2n2-1=19,n就約等於3,get
也就是說最多能夠打印出第三個圖案的全部*;io
3,將咱們第二步獲得的n代入到2n2-1中,計算出來恰好打印完圖案所須要的*的個數,class
也就是說若是用戶輸入19,那麼最多能夠打印出第三個圖案的全部*,打印該圖案所需符號的個數爲2*32 - 1=17;
4,最後將用戶輸入的N減去第三步計算出的2n2-1,能夠獲得打印完後多出來*的個數,即最後多出符號的個數爲:N-(2n2-1),
若是用戶輸入19,那麼最多能夠打印出第三個圖案的全部*,打印該圖案所需符號的個數爲2*32 - 1=17,
最後多出來的*個數爲19-17=2;
5,至於打印出圖案的具體代碼就是經過三層循環嵌套來實現的,第一層控制打印行數,第二層控制打印控制打印空格數,第三層控制打印符號的個數。
6、完整代碼:
#include<stdio.h> #include<math.h> int main() { int number; char ch; int n; int i,j,k; scanf("%d %c",&number,&ch); //經過觀察咱們能夠知道第n個圖案,須要打印的符號個數爲2*n*n-1; //2*n*n-1=number ==> n = sqrt((number+1)/2) n = sqrt((number+1)/2); //判斷最後多出來的圖案的個數 int res = number - (2*n*n-1); //打印倒三角圖案 //控制打印行數 for (i = n; i >= 1; i--) { //控制每行前空格數 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每圖案的個數 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("\n"); } //打印正三角圖案 //控制打印行數 for (i = 2; i <= n; i++) { //控制每行前空格數 for (k = 1; k <= n-i; k++) { printf(" "); } //控制每圖案的個數 for (j = 1; j <= 2*i-1; j++) { printf("%c",ch); } printf("\n"); } printf("%d\n",res); // system("pause"); // getch(); return 0; }