本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
*****
?***
? *
?***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
?***
? *
?***
*****
2
/*
遇到圖形打印,一般是逐行打印,找每一行的規律,通過行數與
圖形個數對應,然后實現圖形的打印;這里題目給出一個正整數,然后給出一個字符;
那么我們通過給出的正整數選出沙漏的最大字符數;因為沙漏都是特定個數;
****
***
三行,兩邊對稱,所以是奇數行,最中間為1;
1+3*2;總個數為7;***** //這一行i=3;3*2-1;*** //這一行i=2;2*2-1;* //這一行i=1;1*2-1;***
*****
五行,1+3*2+5*2==17,總個數為17;
所以行數作為變量,并且我們只需要一邊,即中間為1,然后取一邊乘以2就可以了;一個字符*算不算沙漏呢;應該不算;*/
#include<iostream>
using namespace std;
int main(){//輸入;int N;char c;cin>>N>>c; //輸入個數N和字符c;//首先是找行數,我們只能通過數字判斷形狀;int count=0; //count指當前構成沙漏的字符總個數;int line=1; //存放行數;這里我以中間為第0行;int thisline=0; //當前行數的字符個數;int max=0; //最多字符個數;while(count<N){thisline=2*line-1;if(line==1){count+=thisline; //中間行不用乘以2;}else if(line>1){ //兩邊的行數;count+=thisline*2;}line++;}if(count>N){line-=2; //這里注意我們是從i等于1開始計數的,所以要減一,最后一次大于,又要減一;max=count-thisline*2;}else if(count==N){line--; //這里只用減一次,因為是從1開始計數;max=count;}//找到行數后輸出上半部分;for(int i=line;i>0;i--){ //輸出的行數;//首先輸出空格數;for(int k=line-i;k>0;k--){cout<<' ';}//輸出字符數;for(int j=0;j<2*i-1;j++){ //輸出每行字符數;cout<<c;}//換行;cout<<endl;}//輸出下半部分,注意中間已經在上半部分輸出;for(int i=2;i<=line;i++){ //輸出的行數;//同樣輸出空格數;for(int k=line-i;k>0;k--){cout<<' ';}//輸出字符數;for(int j=0;j<2*i-1;j++){cout<<c;}//換行;cout<<endl;}//輸出剩下字符;用完了不用輸出還是輸出0?;cout<<N-max;return 0;
}