e345: Add Digits - 面試題
內容
給一個正整數 n,將所有位數相加總和,如果總和不是個位數,重複相加步驟直到總和為個位數。
e.g. 345 => 3 + 4 + 5 = 12,12 => 1 + 2 = 3
疑??怎麼覺得好像很眼熟??好像寫過??
那你知道如何不用 Loop/Recursion 來算出解答嗎?
輸入
每一行有一個數字 n,0 <= n <= 2147483647
EOF 結束
0
123
456
輸出
輸出該數字對應到的解答
0
6
6
解題思路
數學題,題目說不用迴圈或遞迴也能解代表有一定的規律,所以先列出前面幾項
數 | 相加和 1 | 相加和 2 |
---|---|---|
0 | 0 | N/A |
1 | 1 | N/A |
2 | 2 | N/A |
3 | 3 | N/A |
4 | 4 | N/A |
5 | 5 | N/A |
6 | 6 | N/A |
7 | 7 | N/A |
8 | 8 | N/A |
9 | 9 | N/A |
10 | 1 | N/A |
11 | 2 | N/A |
… | … | … |
16 | 7 | N/A |
17 | 8 | N/A |
18 | 9 | N/A |
19 | 10 | 1 |
20 | 2 | N/A |
21 | 3 | N/A |
… | … | … |
26 | 8 | N/A |
27 | 9 | N/A |
28 | 10 | 1 |
29 | 11 | 2 |
30 | 3 | N/A |
然後就會由於相加和超過 9 時,會再觸發一次相加直到和變成個位數,而這個動作會讓數的最終合保持在 “1~9” 9 個數字做循環,所以可以用和 9 取餘來表示其規律。
但因為 9 和 9 取餘是 0 ,而題目要求的是 9,所以先將原數減去一取餘完再加回來變成
ans = (n-1) % 9 + 1
來處理數字為 9 的倍數時的例外情況,但這時候又產生另一個問題,當 n 為 0 時會變成 -1 和 9 取餘,所以在取餘前先判斷是否為 0 變成
ans = n != 0 ? (n - 1) % 9 + 1 : 0
然後每次都按公式輸出答案即可,另外在 C 中 -1 % 9 得到的解會是 -1,再加上 1 之後剛好會變回 0,所以不做判斷也可以,只是感覺不太好。
完整程式碼
AC (2ms, 104KB)
|