嘔心瀝血演算法題——水仙花數
阿新 • • 發佈:2018-12-26
// 水仙花數(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();
位數過大沒演算法不支援!