freeCodeCamp/curriculum/challenges/chinese/10-coding-interview-prep/project-euler/problem-41-pandigital-prime.md

2.1 KiB
Raw Blame History

id title challengeType videoUrl dashedName
5900f3951000cf542c50fea8 问题41Pandigital prime 5 problem-41-pandigital-prime

--description--

我们将说n数字是pandigital如果它使用所有数字1到n恰好一次。例如2143是一个4位数的pandigital也是素数。什么是最大的n长数字pandigital素数

--hints--

pandigitalPrime(4)应该返回4231。

assert(pandigitalPrime(4) == 4231);

pandigitalPrime(7)应该返回7652413。

assert(pandigitalPrime(7) == 7652413);

--seed--

--seed-contents--

function pandigitalPrime(n) {

  return n;
}

pandigitalPrime(7);

--solutions--

function pandigitalPrime(n) {
  function isPrime(num) {
    for (let i = 2, s = Math.sqrt(num); i <= s; i++) {
      if (num % i === 0) {
        return false;
      }
    }
    return num !== 1;
  }

  function getPermutations(n) {
    if (n === 1) {
      permutations.push(digitsArr.join(''));
    } else {
      for (let i = 0; i < n - 1; i++) {
        getPermutations(n - 1);
        // swap(n % 2 === 0 ? i : 0, n - 1);
        if (n % 2 === 0) {
          swap(i, n - 1);
        } else {
          swap(0, n - 1);
        }
      }
      getPermutations(n - 1);
    }
  }
  function swap(x, y) {
    let temp = digitsArr[x];
    digitsArr[x] = digitsArr[y];
    digitsArr[y] = temp;
  }
  let max = 0;
  let permutations = [];
  let digitsArr;
  let pandigitalNum = '';

  for (let max = n; max > 0; max--) {
    pandigitalNum += max;
  }

  for (let i = 0; i < pandigitalNum.length; i++) {
    if (max > 0) {
      break;
    } else {
      permutations = [];
      const currMax = pandigitalNum.slice(i);
      digitsArr = currMax.split('');
      getPermutations(digitsArr.length);

      // sort permutations in descending order
      permutations.sort(function(a, b) {
        return b - a;
      });

      for (let perm of permutations) {
        const thisPerm = parseInt(perm);
        if (isPrime(thisPerm)) {
          max = thisPerm;
          break;
        }
      }
    }
  }

  return max;
}