來自 LIOJ,還蠻值得練習的題目。
解題方向
- 怎麼知道一個數字有幾位數?
- 怎麼取出每個位數的數字?
求出位數
把一個數字一直 /10
(記得無條件捨去),直到 0 為止。看總共除幾次,就代表這個數字有幾位數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function digitCount(n) { if(n === 0) return 1 let result = 0 while(n !== 0) { n = Math.floor(n/10) result++ } return result } digitCount(0) digitCount(12) digitCount(123)
|
取出每個位數的數字
對一個數字取餘數 %10
可以取到「最後一位數字」,接著搭配迴圈使用 /10
來更新數字(去掉最後一位數),就可以取出每一個位數的數字:
1 2 3 4 5 6 7 8
| function printSingleDigit(n) { while(n !== 0) { const number = n % 10 console.log(number) n = Math.floor(n/10) } } printSingleDigit(123)
|
輸出結果:
解法
上面問題搞定後,接下來只要依據水仙花數的定義來解題即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function isNarcissistic(n) { let digit = digitCount(n) let sum = 0 let m = n while(m !== 0) { sum += (m%10) ** digit m = Math.floor(m/10) } console.log(sum === n) } isNarcissistic(5) isNarcissistic(1634) isNarcissistic(1024)
|
這裡做兩個小提醒:
n
的值必須拷貝一份,不然最後會變成 0,也就沒辦法做 sum === n
的判斷
m%10 ** digit
,其中 m%10
必須括號起來,否則會先計算 10**digit
作弊解法-轉成字串
前面是用正統的數學計算來取得每一位數還有總位數,但你仔細想想,如果變成字串的話,要做到那些事就容易很多,例如說 '123'
:
- 取得每一位數
str[0] = 1
str[1] = 2
str[2] = 3
- 取得總位數
str.length = 3
所以把剛剛的例子改寫一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function isNarcissisticString(n) { const str = n + '' const digits = str.length let sum = 0 for(let i=0; i<str.length; i++) { sum += Number(str[i]) ** digits } console.log(sum === n) } isNarcissisticString(5) isNarcissisticString(1634) isNarcissisticString(1024)
|
一樣可以求出正確的結果唷!