RosettaCodeData/Task/Smarandache-prime-digital-sequence/JavaScript/smarandache-prime-digital-sequence.js
2026-04-30 12:34:36 -04:00

79 lines
1.9 KiB
JavaScript

function getSmarandachePrime(n) {
if (n < 10) {
switch (n) {
case 1: return 2;
case 2: return 3;
case 3: return 5;
case 4: return 7;
}
}
let s = getNextSmarandache(7);
let result = 0;
for (let count = 1; count <= n - 4; s = getNextSmarandache(s)) {
if (isPrime(s)) {
count++;
result = s;
}
}
return result;
}
function isPrime(test) {
if (test % 2 === 0) return false;
for (let i = 3; i <= Math.sqrt(test); i += 2) {
if (test % i === 0) {
return false;
}
}
return true;
}
function getNextSmarandache(n) {
// If 3, next is 7
if (n % 10 === 3) {
return n + 4;
}
let retVal = n - 4;
// Last digit 7. k = largest position from right where we have a 7.
let k = 0;
while (n % 10 === 7) {
k++;
n = Math.floor(n / 10);
}
// Determine first digit from right where digit != 7.
const digit = n % 10;
// Digit is 2, 3, or 5. 3-2 = 1, 5-3 = 2, 7-5 = 2, so digit = 2, coefficient = 1, otherwise 2.
const coeff = (digit === 2 ? 1 : 2);
// Compute next value
retVal += coeff * Math.pow(10, k);
// Subtract values for digit = 7.
while (k > 1) {
retVal -= 5 * Math.pow(10, k - 1);
k--;
}
// Even works for 777..777 --> 2222...223
return retVal;
}
// Main execution
let s = getNextSmarandache(7);
console.log("First 25 Smarandache prime-digital sequence numbers:");
process.stdout.write("2 3 5 7 ");
for (let count = 1; count <= 21; s = getNextSmarandache(s)) {
if (isPrime(s)) {
process.stdout.write(`${s} `);
count++;
}
}
console.log("\n");
for (let i = 2; i <= 5; i++) {
const n = Math.pow(10, i);
console.log(`${n.toLocaleString()}th Smarandache prime-digital sequence number = ${getSmarandachePrime(n)}`);
}