今天要來解的題目是阿姆斯壯數,阿姆斯壯數是什麼呢?假定給定一個 n 位數的整數,該整數的每個位數乘上 n 次方的總和剛好為該整數,則該數字就為阿姆斯壯數。
ex:
1634 = 1^4 + 6^4 + 3^4+ 4^4
這次的題目就是要輸入兩個數,n, m(n < m 且 n > 0),並且找出給定的 n~m 範圍內的所有阿姆斯壯數。
理解題目後我們就來實作吧!
function armstrongNum(low, high) {
let nums = []; // 記錄阿姆斯壯數
for (let i = low; i <= high; i++) {
// 計算i幾位數,並將每個位數存起來
let numLength = 0; // 記錄i是幾位數
let digits = []; // 記錄i每個位數的數字
let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
}
return nums;
}
function armstrongNum(low, high) {
let nums = [];
for (let i = low; i <= high; i++) {
// 計算i幾位數,並將每個位數存起來
let numLength = 0; // 記錄i是幾位數
let digits = []; // 記錄i每個位數的數字
let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
while (tempNum > 0) {
let digit = Math.floor(tempNum % 10);
digits.push(digit);
tempNum = Math.floor(tempNum / 10);
numLength++;
}
}
return nums;
}
接著要將每個位數取出來乘上 numLength 次 (numLength記錄 i 是幾位數),因此建立雙層 for 迴圈,外層負責取出每個位數的數字,內層負責乘法的動作,最後得出一個總和。如果這個總合和 i 的值(當前判斷是否為阿姆斯壯數的數字)一樣,就可以斷定此 i 是阿姆斯壯數。
之後將 i 推入 nums 陣列(阿姆斯壯數),
function armstrongNum(low, high) {
let nums = [];
for (let i = low; i <= high; i++) {
// 計算i幾位數,並將每個位數存起來
let numLength = 0; // 記錄i是幾位數
let digits = []; // 記錄i每個位數的數字
let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
while (tempNum > 0) {
let digit = Math.floor(tempNum % 10);
digits.push(digit);
tempNum = Math.floor(tempNum / 10);
numLength++;
}
// 將各個位數取出乘numLength次
for (let j = 0; j < numLength; j++) {
let digit = digits[j];
let tempDigit = digits[j];
for (let k = 1; k < numLength; k++) { // 這裡k要從1開始
digit *= tempDigit;
}
sum += digit;
}
if (sum == i) {
nums.push(i);
}
}
return nums;
}
透過這行程式運行的結果如下:
console.log(armstrongNum(1, 1000));
這次的程式碼在以下連結:
https://github.com/a90100/javascript-data-structure/blob/master/day26-armstrong-number.js
明天我們將來實作"凱撒密碼"的問題!