Нахождение у него наибольшего палиндромного числа, которое является произведением двух простых (простых) пятизначных чисел. Javascript

1

Я пытался написать программу, которая возвращает самое большое палиндромное число, которое является продуктом двух простых пятизначных чисел и возвращает сами факторы.

Простое число - это натуральное число, которое делится только на 1 и себя (2, 3, 5, 7, 11,...)

Палиндромное число читается одинаково в обоих направлениях (например, ABBA).

if(isPalin(mul) && isPrime(i) && isPrime(j))

function isPrime(i){
  for (var k = 2; k <= i; k++) {
      if (i%k===0 && i!==k) {
          return false;
    }
  }
return true;
}



<!--code-->


<script>

function largestPalindrome(){

    for(var i = 99999; i>10000; i--){
        for(var j = 99999; j>10000; j--){
            var mul = j*i;
            if(isPalin(mul) && isPrime(i) && isPrime(j)){
                return i * j;


            }
        }

    }
}


function isPalin(i){
    return i.toString() == i.toString().split("").reverse().join("");
    }

function isPrime(i){
  for (var k = 2; k <= i; k++) {
      if (i%k===0 && i!==k) {
          return false;
    }
  }
return true;
}

console.log(largestPalindrome());

</script>

Когда я запускаю эту программу, она ничего не отображает в консоли, и я не знаю, почему.

  • 2
    Временная сложность вашего кода составляет O(n^3) что при n = 10^4 занимает слишком много времени. напечатать что-нибудь в вашем isPrime и других функциях, чтобы убедиться, что это происходит
Теги:
algorithm

2 ответа

1

Посмотрите эту ссылку на временную сложность алгоритмов. Также это, чтобы увидеть, как временная сложность может влиять на эффективность вашей программы.

Эта часть не очень точная, но она может помочь. Ваш первый цикл работает 99999-10000 раз. Также это выполняется для второго цикла. isPrime в худшем случае работает (99999). Поэтому, if (i%k===0 && i!==k) return false; пробегает total_ops = (99999-10000)^2*(99999) раз (мы пропускаем другую часть вашего кода). Если ваша программа, написанная в c++, которая быстрее, чем java-script, может работать около 2*(10^8) простой операции в секунду. Время выполнения вашей программы примерно (очевидно, больше) total_ops/(2*10^8) (я предлагаю рассчитать его, чтобы иметь оценку...).

PS: Вы можете распечатать свои функции, чтобы обеспечить их прогресс...

0

Задача :: Сложность времени

улучшения

  1. IsPrime()

    function isPrime(n)
    {
        // Corner cases
        if (n <= 1)  return false;
        if (n <= 3)  return true;
    
        // This is checked so that we can skip 
        // middle five numbers in below loop
        if (n%2 == 0 || n%3 == 0) return false;
    
        for (var i=5; i*i<=n; i=i+6)
            if (n%i == 0 || n%(i+2) == 0)
               return false;
    
        return true;
    }
    

    функция isprime не оптимизирована. Вы должны использовать это.

  2. Не находите каждое простое число 2 раза.! Просто найдите все простые числа один раз, сохраните их в списке, а затем выберите каждое число из основного списка и проверьте, является ли это палиндром.

    var primelist = [];
    for(var i = 99999; i > 10000; i++)
    {
         if(isprime(i))
         {
              primelist.push(i);
         }
    }
    for (var i = 0; i < primelist.length; i++) {
        for (var j = 0; j < primelist.length; j++) 
        {
             if(isPalindrome(i*j))
             {
                 // Number you want.
    
                 return (i*j);
             }
        }  
    }
    
  3. проверить, начать с самых больших простых чисел.

  4. 5-значный номер начинается с 10000 до 99999 вместо 11111-99999. Хотя, он не меняет выход функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню