1. 程式人生 > >2018-2019寒假作業 其一 列印沙漏

2018-2019寒假作業 其一 列印沙漏

2018-2019 寒假作業 其一

列印沙漏

7-1 列印沙漏 (20 分)

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

*****
 ***
  *
 ***
*****
2
  作者: 陳越 單位: 浙江大學 時間限制: 400 ms 記憶體限制: 64 MB 程式碼長度限制: 16 KB

一 我寫的程式碼以及註釋

#include<stdio.h>
#include<math.h>
int main (void)
{
int a,b=1,c,d,e,f,h;        //定義變數a與g為輸入的值,b為沙漏的一半三角形的高,c表示沙漏總字元數或沙漏的每一層的字元數,h表示未使用的字元數,d和e和f為for迴圈的中間變數
char g;
scanf("%d %c",&a,&g);
for(;c<=a;b++){            //利用for迴圈從小到大比較a與c的大小並確定b的值
c=pow(b,2)*2-1;}
b=b-2,d=b;    
for(f=0,e=0;d>0;d--)     //使用for迴圈列印沙漏上部分和中部分
{
c=d*2-1;
for(;e>0;e--)printf(" ");
for(;c>0;c--)printf("%c",g);
printf("\n");
f++,e=f;
}
for(f=b-2,e=f,d=2;d<=b;d++)  //使用for迴圈列印沙漏下部分
{
c=d*2-1;
for(;e>0;e--)printf(" ");
for(;c>0;c--)printf("%c",g);
printf("\n");
f--,e=f;
}
c=pow(b,2)*2-1; //計算並輸出未使用的符號數
h=a-c;
printf("%d",h);
return 0;
}

 

二 我的思路啊

首先找出沙漏的規律,我發現沙漏分為上中下三個部分,上中可成一個倒三角。

然後倒三角每一層的字元均為層數的兩倍減一,可以用迴圈來列印空格;但是字元前還有空格,所以還要加一個迴圈列印空格。

此後我發現沙漏的總字元為倒三角層數的平方的兩倍減一,由此可確定倒三角的層數

又後開始列印沙漏

最後由輸入數減去沙漏總字元數得到未使用的字元數

 

三 我的錯誤啊

在求未使用的字元數時,沒有分步計算,結果錯誤

截圖

 

四 題目,見一以上的字

 

五 我的正確結果截圖