一、題目:
題目鏈接
本題要求你寫個程式把給定的符號列印成沙漏的形狀,例如給定17個“*”,要求按下列格式列印
***** *** * *** *****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,
再從小到大順序遞增;首尾符號數相等,給定任意N個符號,不一定能正好組成一個沙漏,要求列印出的沙漏能用掉盡可能多的符號,
二、輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔,
三、輸入樣例:
19 *
四、輸出樣例:
***** *** * *** ***** 2
五、設計思路:
為了方便敘述,我先假設用戶需要列印的符號的個數為N,需要列印的符號是*;
1,首先我們通過觀察該圖案,利用等引數列的求和公式可以得到一個規律:第n個圖案所包含*的個數為2n2-1個;
2,然后根據用戶輸入的N來判斷最多可以列印第幾個完整圖案,例如,如果用戶輸入19,那么令2n2-1=19,n就約等于3,
也就是說最多可以列印出第三個圖案的所有*;
3,將我們第二步得到的n代入到2n2-1中,計算出來剛好列印完圖案所需要的*的個數,
也就是說如果用戶輸入19,那么最多可以列印出第三個圖案的所有*,列印該圖案所需符號的個數為2*32 - 1=17;
4,最后將用戶輸入的N減去第三步計算出的2n2-1,可以得到列印完后多出來*的個數,即最后多出符號的個數為:N-(2n2-1),
如果用戶輸入19,那么最多可以列印出第三個圖案的所有*,列印該圖案所需符號的個數為2*32 - 1=17,
最后多出來的*個數為19-17=2;
5,至于列印出圖案的具體代碼就是通過三層回圈嵌套來實作的,第一層控制列印行數,第二層控制列印控制列印空格數,第三層控制列印符號的個數,
六、完整代碼:
#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; }
七、列印效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49383.html
標籤:C
上一篇:斐波那契數列
下一篇:素數對猜想
