VCHS Computer Science
Computer Science at Valley Catholic High School
Pages
Home
APCSA
APCSP
Ten Commandments
Jump
Truncatable Primes
Upper:
(positive integer)
Source Code
<label>Upper:</label> <input id="the-input" type="number" min="1" step="1"> (positive integer) <p id="the-output"></p> <script> const inputElement = document.getElementById("the-input"); const outputElement = document.getElementById("the-output"); let isPrime; inputElement.addEventListener("change", main); function main(event) { const max = parsePositiveInt(event); // Arrays const RPrimes = []; const LPrimes = []; const RLPrimes = []; // Cue setTimeout(function() { let s = "Searching for primes less than " + max + "..."; outputElement.innerHTML = s; }, 0); // Search isPrime = getPrimeSieve(max); for (let i = 1; i < max; ++i) if (isPrime[i]) { const isRP = isRightPrime(i); const isLP = isLeftPrime(i); if (isRP) RPrimes.push(i); if (isLP) LPrimes.push(i); if (isRP && isLP) RLPrimes.push(i); } // Output let s = ""; s += formatAnswer(RPrimes, "right truncatable", max); s += "</p><p>" + formatAnswer(LPrimes, "left truncatable", max); s += "</p><p>" + formatAnswer(RLPrimes, "right and left truncatable", max); setTimeout(function() { outputElement.innerHTML = s; }, 1000); } function parsePositiveInt(event) { const i = Math.floor(event.target.value); return event.target.value = i < 1 ? 1 : i; } function formatAnswer(primes, category, upperLimit) { const n = primes.length; const width = 10; const verb = n === 1 ? "is" : "are"; const optional_s = n === 1 ? "" : "s"; let s = "There " + verb + " " + n + " "; s += category + " prime" + optional_s + " less than " + upperLimit; s += (n > 0) ? ":<br>" + primes[0] : ""; for (let i = 1; i < n; ++i) { s += ","; s += (i % width === 0) ? "<br>" : " "; s += primes[i]; } return s + "."; } // See: https://en.wikipedia.org/wiki/Generating_primes#Prime_sieves function getPrimeSieve(upper) { const sieve = []; for (let i = 0; i < upper; ++i) sieve.push(true); sieve[0] = false; sieve[1] = false; for (let i = 2; i < upper; ++i) if (sieve[i]) for (let j = 2 * i; j < upper; j += i) sieve[j] = false; return Object.freeze(sieve); } // See: https://en.wikipedia.org/wiki/Truncatable_prime function isRightPrime(n) { let s = n.toString(); const len = s.length; for (let upper = len; upper > 0; --upper) if (!isPrime[parseInt(s.substring(0, upper))]) return false; return true; } function isLeftPrime(n) { let s = n.toString(); const len = s.length; for (let lower = 0; lower < len; ++lower) if (!isPrime[parseInt(s.substring(lower, len))]) return false; return true; } </script>
Newer Post
Older Post
Home