TOJ 104
題目
https://toj.tfcis.org/oj/pro/104/
輸入一個正整數 $n$ ,輸出高度為 $n$ 的星星樹
想法
第一次接觸星星樹這類的題目可以藉由觀察來寫下迴圈
我們可以先把星星樹的每一層給一個數字
以下考慮 $n=4$ 的情況
1 2 3 4
| 0 | * 1 | *** 2 | ***** 3 |*******
|
接下來觀察每一行內空格和數字的關係
1 2 3 4
| 第 0 行 有 3 個空格 第 1 行 有 2 個空格 第 2 行 有 1 個空格 第 3 行 有 0 個空格
|
因為空格的數量與 $n$ 息息相關,我們換成與 $n$ 相關的話來看看
1 2 3 4
| 第 0 行 有 n-1 個空格 第 1 行 有 n-2 個空格 第 2 行 有 n-3 個空格 第 3 行 有 n-4 個空格
|
再加上與行數的關係
1 2 3 4
| 第 0 行 有 (n-1)-0 個空格 第 1 行 有 (n-1)-1 個空格 第 2 行 有 (n-1)-2 個空格 第 3 行 有 (n-1)-3 個空格
|
發現到關係了嗎? 那麼我們也考慮星星的情況
1 2 3 4
| 第 0 行 有 1 個星星 第 1 行 有 3 個星星 第 2 行 有 5 個星星 第 3 行 有 7 個星星
|
星星的數量無論 $n$ 是多少,順序仍然相同,都是從 $1$ 開始,並且每次加上 $2$ ,所以接下來直接考慮與行數的關係
1 2 3 4
| 第 0 行 有 (0+1)*2-1 個星星 第 1 行 有 (1+1)*2-1 個星星 第 2 行 有 (2+1)*2-1 個星星 第 3 行 有 (3+1)*2-1 個星星
|
有了這些關係式,我們就可以輕易地寫出巢狀迴圈了
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<iostream> using namespace std;
int main() { int n; cin>>n; for(int i=0 ; i<n ; i++){ for(int j=0 ; j<n-1-i ; j++){ cout<<' '; } for(int j=0 ; j<2*(i+1)-1 ; j++){ cout<<'*'; } cout<<'\n'; } return 0; }
|
複雜度分析
總時間複雜度約為 $O(n^2)$