打印沙漏
本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
思路:
1、確定n對應可打印的沙漏行數。設置參數sum爲沙漏中*
的總數,i表示沙漏擴展的層數,則有sum=2*
i*
(i+2)+1,將sum和n進行比較,當sum>n時跳出循環。設row表示最終輸出的沙漏的除最中間行外上/下部分的層數,因sum不可超過n且跳出循環前仍需執行一次i++操作,故row=i-2。
2、打印沙漏。分爲上下兩部分打印。對於中間行向外擴展的第j行而言,首先打印row-j個空格,之後打印2j+1個字符;中間行可做j=0處理。
代碼:
#include <stdio.h>
int main()
{
int n,i=0,sum=0,row;
char c;
scanf("%d %c",&n,&c);
while(sum<=n){
sum=2*i*(i+2)+1;
i++;
}
row = i-2;
for(int j=row;j>=0;j--){
for(int k=0;k<row-j;k++){
printf(" ");
}
for(int k=row-j;k<row+j+1;k++){
printf("%c",c);
}
printf("\n");
}
for(int j=1;j<=row;j++){
for(int k=0;k<row-j;k++){
printf(" ");
}
for(int k=row-j;k<row+j+1;k++){
printf("%c",c);
}
printf("\n");
}
printf("%d\n",n-2*row*(row+2)-1);
}
出現的錯誤
1、第一次寫程序時未設置sum的初值,導致n取16以下時無法進行進入while循環,17以上則可進入,未想明白原因,可能原因是sum隨機賦值的初值大於16?