1. 程式人生 > >寒假作業1:列印沙漏

寒假作業1:列印沙漏

7-1 列印沙漏 (20 分)本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印     *****
     ***
      *
     ***
    *****
   “所謂沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:     19 * 輸出樣例:     *****
     ***
      *
     ***
    *****
    2     我的程式碼
#include <stdio.h>
int
main() { int n; char c; scanf("%d %c",&n,&c); int sum=1; int i=1; while(sum<=n) //打印出上半部分的行數i { sum+=2*(2*(i+1)-1); //每向上多加一行就增加2*(i+1)-1個"*"(可以等差數列思維去思考)乘以2是因為上下兩部分對稱增加了一行 if(sum<=n) i++; } int j,k; for(j=0;j<i;j++) //
列印上半部分,確定列印行數 { for(k=0;k<j;k++) //列印空格 printf(" "); for(k=0;k<2*(i-j)-1;k++) //列印號"*" { printf("%c",c); } printf("\n"); } for(j=2;j<=i;j++) //下半部分同上半部分的原理確定行數 { for(k=0;k<i-j;k++) printf(
" "); for(k=0;k<2*j-1;k++) { printf("%c",c); } printf("\n"); } printf("%d",n-(sum-2*(2*(i+1)-1))); //注意最後要直接輸出的沒有用到的符號,要減去上面while語句多累加了一次的符號個數 return 0; }

 

思路:
1.遇到這種帶你上下對稱圖形題,將圖形分為上下兩部分,分別列印。
2.首先要思考列印行數,其次是每行前面的空格,然後是每行需要輸入的符號個數如何表達出來
3.注意充分利用你定義的變數達到目的
4.特別注意最後要輸出來剩餘未用的符號,要減去上面while語句多累加了一次的符號個數