呕心沥血算法题——水仙花数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26924703/article/details/81458241
// 水仙花数(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();

位数过大没算法不支持!

猜你喜欢

转载自blog.csdn.net/qq_26924703/article/details/81458241