iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 26
1
Software Development

使用JavaScript學習資料結構與演算法系列 第 26

Day26-解題-Armstrong number 阿姆斯壯數

今天要來解的題目是阿姆斯壯數,阿姆斯壯數是什麼呢?假定給定一個 n 位數的整數,該整數的每個位數乘上 n 次方的總和剛好為該整數,則該數字就為阿姆斯壯數。
ex:
1634 = 1^4 + 6^4 + 3^4+ 4^4

這次的題目就是要輸入兩個數,n, m(n < m 且 n > 0),並且找出給定的 n~m 範圍內的所有阿姆斯壯數。

理解題目後我們就來實作吧!

  1. 我們先宣告 armstrongNum() 函式,搭配搜索範圍的兩個參數,並用 nums 陣列把找到的阿姆斯壯數記錄起來,接著用 for 迴圈,範圍是給定的搜索範圍,然後在迴圈內再宣告幾個變數。
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;
}
  1. 接著要思考的是如何將要判斷是否為阿姆斯壯數的每個位數存起來,並且記錄該數是幾位數。因此我們新增一個 while 迴圈完成這部分。
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;
}
  1. 接著要將每個位數取出來乘上 numLength 次 (numLength記錄 i 是幾位數),因此建立雙層 for 迴圈,外層負責取出每個位數的數字,內層負責乘法的動作,最後得出一個總和。如果這個總合和 i 的值(當前判斷是否為阿姆斯壯數的數字)一樣,就可以斷定此 i 是阿姆斯壯數。

  2. 之後將 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

明天我們將來實作"凱撒密碼"的問題!


上一篇
Day25-解題-Perfect Number 完美數
下一篇
Day27-解題-Caesar Cipher 凱薩密碼
系列文
使用JavaScript學習資料結構與演算法30

尚未有邦友留言

立即登入留言