📅  最后修改于: 2023-12-03 15:01:49.191000             🧑  作者: Mango
在数学中,普罗尼克数是指一个素数,其旋转的数也都是素数。因此,这个题目可以转化为判断一个数是否为普罗尼克数。
对于一个数,我们可以将其每一位数都旋转一遍,得到所有可能的数,再判断这些数是否为素数。如果都是素数,则原数是普罗尼克数。为了减少重复计算,我们可以把每个普罗尼克数的旋转结果缓存起来,以后再进行判断时直接从缓存中取出。
下面是一个完整的Javascript程序,用于判断一个数组中的所有数是否都可以通过旋转数字转换为普罗尼克数。
// 判断一个数是否为素数
function isPrime(num) {
if (num < 2) {
return false;
}
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {
return false;
}
}
return true;
}
// 生成一个数字的所有旋转结果
function generateRotations(num) {
const rotations = [];
const digits = num.toString();
for (let i = 0; i < digits.length; i++) {
rotations.push(parseInt(digits.slice(i) + digits.slice(0, i)));
}
return rotations;
}
// 判断一个数是否为普罗尼克数
function isCircularPrime(num, cache) {
if (cache.has(num)) {
return true;
}
const rotations = generateRotations(num);
for (let i = 0; i < rotations.length; i++) {
if (!isPrime(rotations[i])) {
return false;
}
}
for (let i = 0; i < rotations.length; i++) {
cache.add(rotations[i]);
}
return true;
}
// 判断一个数组中的所有数是否都可以通过旋转数字转换为普罗尼克数
function allCircularPrimes(arr) {
const cache = new Set();
for (let i = 0; i < arr.length; i++) {
if (!isCircularPrime(arr[i], cache)) {
return false;
}
}
return true;
}
console.log(allCircularPrimes([2, 3, 5, 7])); // 输出 true
console.log(allCircularPrimes([2, 3, 4, 5])); // 输出 false