1. 程式人生 > >C++ L1-002. 列印沙漏

C++ L1-002. 列印沙漏

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 $
=1+(3+5++2n1)×2=1+(3+5+…+2n-1)×2


=1+(3+2n1)(n1)2×2=1+\frac {(3+2n-1)(n-1)} {2}×2
=1+2n22=1+2n^2-2
=2n21=2n^2-1
N=2n21∴N=2n^2-1
n=N+12n=\sqrt [] {\frac{N+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; }