C++ L1-002. 列印沙漏
阿新 • • 發佈:2019-02-17
L1-002. 列印沙漏
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
屬性 | 要求 | 屬性 | 要求 |
---|---|---|---|
時間限制 | 400 ms | 記憶體限制 | 65536 kB |
程式碼長度限制 | 8000 B | 判題程式 | Standard |
解析:
n = sqrt((double) (N + 1) / 2);
N是符號個數,n是計算出幾行,就卡在這裡了。
好怕你們問我為什麼是這個式子。來來來,看下邊:
如果星號總數為N,從第一行到中間一顆星那一行一共為n行,這樣一直下去的話,第n個圖形就是:
$N=1+3×2+5×2+…+(2n-1)×2 $
即n = sqrt((double) (N + 1) / 2)
答案:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int N;
char c;
cin>>N>>c;
int i,j;
int n = sqrt((double) (N + 1) / 2); //計算有幾行
for (i = 1; i <= n; i++)
{
for (j = 1; j<i; j++)
cout<<" ";
for (j = 2 * (n - i) + 1; j >= 1; j--)
cout<<c;
cout<<endl;
}
for (i = 1; i <= n - 1; i++)
{
for (j = 1; j <= n-i-1; j++)
cout<<" ";
for (j = 1; j <= 2 * i + 1; j++)
cout<<c;
cout<<endl;
}
cout<<N - (2 * n*n - 1);
return 0;
}