本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
************ *****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
************ ***** 2
?
#include<cstdio> #include<cmath>int main(){int n;char c;scanf("%d %c",&n,&c);int bottom = (int)sqrt(2.0*(n+1))-1; //根據不等式推算出第一層的符號的個數 if(bottom % 2 == 0) bottom--; //題目規定奇數個 int used = (bottom+1)*(bottom+1)/2-1;for(int i = bottom; i >= 1; i-=2){ //倒著輸出三角形 for(int j = (bottom - i)/2; j >0; j--){ //空格個數和層次等式關系 printf(" ");}for(int j = 0; j < i; j++){printf("%c",c);}printf("\n");}for(int i = 3; i <= bottom; i +=2 ){ //輸出正三角形形狀,除去頂部那個點 for(int j = 0; j < (bottom -i)/2; j++){printf(" ");}for(int j = 0; j < i; j++)printf("%c",c);printf("\n");} printf("%d\n",n-used);return 0; }
?
//line找的不對,第三個測試點么通過。 #include<cstdio> #include<cmath>int getLine(int n){if(n > 1000) return 0;int x = 1;while(1){if((2*(x-1)*(x-1)<= n-1) &&(2*(x+2)*(x-1) >= n - 1))return x;else x++;} }int main(){int n;char c;scanf("%d %c",&n,&c);int line = getLine(n);int used = line * line * 2 - 1;int bottom = 2*line-1;for(int i = bottom; i >= 1; i -= 2){for(int j = 0; j <(bottom - i)/2; j++) printf(" ");for(int j = 0; j < i; j++) printf("%c",c);printf("\n");}for(int i = 3; i <= bottom; i += 2){for(int j = 0; j < (bottom - i)/2; j++) printf(" ");for(int j = 0; j < i; j++) printf("%c",c);printf("\n");}printf("%d\n",n - used);return 0; }
?