以下想法有其中兩種是可行的,一種會超時(TLE),猜猜看是哪一個!
for
迴圈,從 位數的第一個數,檢查到 位數的最後一個數。m += 2
,若 為第一個符合條件的 位數字,則記錄下來,此即所求。A. 答案是想法一!因為a、b
之間的數字,在位數k
較大的時候,檢查了太多不必要的數字。
已知位數限制為 ,在最極端的狀況:,需要檢查的數字個數,量級到了 ~ 之間,顯然會超過時間限制。
相較之下,想法二、三只檢查了「完全平方數」,平方後不超過 10 位數的數字,最大不超過 。
A. 有兩種方法。
[法一] 使用while
迴圈處理整數變數
宣告一個總和變數,只要除以 10 不為 0 就 +1。迴圈總共執行幾次,就是幾位數。
[法二] string
的size()
可以使用 C++ 11 中的stoi
函式。先將一個數字轉換成字串(string
),再用字串長度判斷位數。若你是使用code::blocks撰寫程式,需要手動調整使用的編譯器版本,具體作法可參考這裏。
A. 承上,使用迴圈檢查每一個位數,確認都能被 2 整除即可。具體如何實作呢?你可以宣告一個布林變數is_all_even
,初始值為true
,只要有一個位數的數字為奇數,就把is_all_even
設為false
,然後結束迴圈,不用再繼續檢查下去。
若要將其改寫為自訂函式,回傳資料型態可以設為布林值,代表「是否各位數字皆為偶數」:
int
來做題目,為什麼會拿到 WA(15%)?A. 因為題目有說到,最多為 10 位數字,int
型態的數字無法容納所有 10 位數字,可能會出現 溢位(overflow) 狀況,進而計算錯誤的結果。幸好數字也沒有太大,請嘗試使用長整數(long long
)這個資料型別,其可容納的數字範圍可上網查詢。
這題楷宗老師有特別說明最小公倍數的解法,請參考函式實作示例。以下將延續課堂講解的解題邏輯進行說明。
A. 網路上有很多種解法,歡迎同學們去查查看,觀察每種解法的思路。最常看到的寫法為:
||
起來就是閏年判斷的條件式。大部分人應該都學過閏年判斷,不妨嘗試寫成自訂函式,在主程式呼叫使用。
A. 做法有非常多,順著加、倒著扣都有對應的寫法。而課堂範例的思路大概是這樣的:
A. 閏年的影響視在特定年份的 2 月多 1 天。基本判斷準則如下:
同時符合以上條件,才需要多加一天。
A. 宣告一個陣列,存放每個月的天數:
另外,也可以宣告 13 個整數的陣列,在陣列最前面多放一個數字 0 ,如此一來,就可以接以月份為陣列索引值,取用每個月對應的天數。
A. 建議出幾筆測資給自己測試。例如,我喜歡拿 1 個人、1 天後回家,來測試閏年/非閏年跨天、跨月、跨年的各種可能性:
發想各種例外情況,避免無端被扣分,是賽後測評機制的重要能力。這題是很好的練習機會,大家試試看吧!
(待補)