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;
}
二 我的思路啊
首先找出沙漏的規律,我發現沙漏分為上中下三個部分,上中可成一個倒三角。
然後倒三角每一層的字元均為層數的兩倍減一,可以用迴圈來列印空格;但是字元前還有空格,所以還要加一個迴圈列印空格。
此後我發現沙漏的總字元為倒三角層數的平方的兩倍減一,由此可確定倒三角的層數
又後開始列印沙漏
最後由輸入數減去沙漏總字元數得到未使用的字元數
三 我的錯誤啊
在求未使用的字元數時,沒有分步計算,結果錯誤
截圖
四 題目,見一以上的字
五 我的正確結果截圖