1. 程式人生 > >嘔心瀝血演算法題——水仙花數

嘔心瀝血演算法題——水仙花數

// 水仙花數(Narcissistic number)
// 也被稱為超完全數字不變數(pluperfect digital invariant, PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong number)
// 水仙花數是指一個 n 位數,它的每個位上的數字的 n 次冪之和等於它本身
// 例如:1^3 + 5^3+ 3^3 = 153

// 水仙花數的位數
let weishu = 3;

function p(num) {
   return Math.pow(num, weishu);
}

/**
 * @param pw 快取陣列
 * @param cishu 每個數字在n位數中出現的次數
 * @param cur 當前處理的是陣列cishu的第幾位
 * @param use n位的名額已經甩掉了多少
 */
function f(pw, cishu, cur, use) {
   if (cur == 10) {
      ji_suan(pw, cishu);
      return;
   }
   // 對當前位置所有可能進行列舉
   for (let i = 0; i < weishu - use + 1; i++) {
      cishu[cur] = i; 0
      f(pw, cishu, cur + 1, use + i);
   }
}

function ji_suan(pw, cishu) {
   let sum = 0;
   for (let i = 0; i < 10; i++) {
      sum = sum + (pw[i] * cishu[i]);
   }
   let s = "" + sum;
   if (s.length != weishu)
      return;
   let nn2 = new Array(10);
   for (let i = 0; i < 10; i++) {
      nn2[i] = 0;
   }
   for (let i = 0; i < weishu; i++) {
      nn2[s.charAt(i)]++;
   }
   for (let i = 0; i < 10; i++) {
      if (cishu[i] != nn2[i]) {
         return;
      }
   }
   console.log(s);
}

function run() {
   // 計算0-9的n次冪並儲存在陣列中
   let pw = new Array(10);
   for (let i = 0; i < pw.length; i++) {
      pw[i] = p(i);
   }
   // 定義一個數組存貯每個數字在n位數中出現的次數
   let cishu = new Array(10);
   for (let i = 0; i < 10; i++) {
      cishu[i] = 0;
   }
   f(pw, cishu, 0, 0);
}

run();

位數過大沒演算法不支援!