Advertisement
Senseye

Prime number palindrome JavaScript

Sep 28th, 2018
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function () {
  2.     class Result {
  3.         constructor(palindrome, left, right) {
  4.             this.palindrome = palindrome;
  5.             this.left = left;
  6.             this.right = right;
  7.         }
  8.     }
  9.  
  10.     class Checker {
  11.         constructor() {
  12.             this.digits = new Array(10).fill(0);
  13.         }
  14.  
  15.         isPalindrome(value) {
  16.             const digits = this.digits;
  17.  
  18.             let i = 0;
  19.             while (value > 0) {
  20.                 digits[i] = value % 10;
  21.                 i++;
  22.  
  23.                 value = ~~(value / 10);
  24.             }
  25.  
  26.             const limit = i >> 1;
  27.  
  28.             for (let j = 0; j < limit; j++) {
  29.                 if (digits[j] !== digits[i - 1 - j]) {
  30.                     return false;
  31.                 }
  32.             }
  33.  
  34.             return true;
  35.         }
  36.     }
  37.  
  38.     function getPrimeNumbers(from, to) {
  39.         // start from zero, so + 1
  40.         const size = to + 1;
  41.  
  42.         const variants = new Array(size).fill(true);
  43.  
  44.         const limit = Math.ceil(Math.sqrt(to));
  45.  
  46.         // Sieve of Eratosthenes
  47.         for (let i = 2; i < limit; i++) {
  48.             if (variants[i]) {
  49.                 for (let j = i * i; j < size; j += i) {
  50.                     variants[j] = false;
  51.                 }
  52.             }
  53.         }
  54.  
  55.         const result = [];
  56.         for (let i = from; i < size; i++) {
  57.             if (variants[i]) {
  58.                 result.push(i);
  59.             }
  60.         }
  61.         return result;
  62.     }
  63.  
  64.     function findResult() {
  65.         // Max possible result, all 10-digits palindromes % 11 == 0
  66.         const max = 999999999;
  67.  
  68.         const numbers = getPrimeNumbers(10000, 99999);
  69.         const size = numbers.length;
  70.  
  71.         const checker = new Checker();
  72.  
  73.         let result = new Result(0, 0, 0);
  74.  
  75.         for (let i = 0; i < size; i++) {
  76.             for (let j = i + 1; j < size; j++) {
  77.                 const left = numbers[i];
  78.                 const right = numbers[j];
  79.                 const possible = left * right;
  80.  
  81.                 if (possible > max) {
  82.                     break;
  83.                 }
  84.  
  85.                 if (possible > result.palindrome && checker.isPalindrome(possible)) {
  86.                     result = new Result(possible, left, right);
  87.                 }
  88.             }
  89.         }
  90.  
  91.         return result;
  92.     }
  93.  
  94.     const startTime = Date.now();
  95.     const result = findResult();
  96.     const endTime = Date.now();
  97.  
  98.     document.getElementById("js-palindrome").innerHTML = result.palindrome.toString();
  99.     document.getElementById("js-prime-number-left").innerHTML = result.left.toString();
  100.     document.getElementById("js-prime-number-right").innerHTML = result.right.toString();
  101.     document.getElementById("js-duration").innerHTML = (endTime - startTime).toString();
  102. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement