題目描述

烏托邦樹每逢春天,它就會長高兩倍;每逢夏天,它就會長高一公尺。每次長高的期間,稱為「成長周期」。



蘿拉在春天的時候種了一顆一公尺的烏托邦樹苗。在經過N個成長周期後,她的烏托邦樹會有多高?

原題網址

輸入格式

第一行輸入測試資料的數量T,範圍在1到10之間(包含1和10)。接下來的T行每行要輸入經過的「成長周期」次數N,範圍在0到60之間(包含0和60)。

輸出格式

計算每組測試資料的結果,並輸出烏托邦樹經過N個「成長周期」之後的高度。

範例輸入

3
0
1
4

範例輸出

1
2
7

額外解釋

範例有三組測試資料。

第一組測試資料要計算經過0個「成長周期」後的高度,那就是一開始的高度,因此是1公尺。

第二組測試資料要計算經過1個「成長周期」後的高度,因為現在是春天,所以要長高兩倍的大小,因此高度是1*2=2公尺。

第三組測試資料要計算經過4個「成長周期」後的高度,因為現在是春天,所以要先長高兩倍的大小,因此高度是1*2=2公尺。接著到夏天,要長高1公尺,因此高度是2+1=3公尺。接著到春天,要長高兩倍的大小,因此高度是3*2=6公尺。接著到夏天,要長高1公尺,因此高度是6+1=7公尺。

解題概念

這裡不需要去管什麼春天夏天的情境,只是將一個初始數值1,再經過N次的計算而已。第一次計算要將初始值乘二,第二次計算要將第一次的結果值加一,第三次計算要將第二次的結果值乘二……依此類推。所以可以藉由判斷目前執行的次數能不能整除以二來決定要進行怎麼樣的計算。

參考答案

import java.util.Scanner;

public class Solution {

    public static void main(final String[] args) throws Exception {
        final Scanner sc = new Scanner(System.in);
        int testCase = sc.nextInt();
        while (testCase-- > 0) {
            int height = 1;
            final int n = sc.nextInt();
            for (int i = 0; i < n; ++i) {
                if (i % 2 == 0) {
                    height *= 2;
                } else {
                    ++height;
                }
            }
            System.out.println(height);
        }
    }
}