Есть заданное число не больше 30.Нужно вывести простые числа и суммировать рядом стоящие два "справа" и два "слева". Что посоветуйте?

function solution(k){
  let arr = [];
  s:for(let i = 0;i< 15;i++){
  
  for (let j = 0; j < i; j++) {
    if (i % j == 0) {
        continue s;
    }
  }
  arr.push(i);

  }
 let a = arr.indexOf(k)-1;
 let b = arr.indexOf(k)-2;
 let c = arr.indexOf(k)+1;
 let d = arr.indexOf(k)+2;
 return arr[a]+arr[b]+arr[c]+arr[d];

  
  }console.log(solution(5));

Мое решение выдается как НЕ оптимальное.заранее спосибо


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

Если нужно найти по два простых числа справа и слева указанного — их и находите, незачем искать прямо все простые, а потом среди них искать близкие к заданному числу. Почему перебор до i < 15, а если введут 23 ?)

console.log(solution(5));

function isPrime(n) {
  if (n == 2) return true;
  if (n % 2 == 0) return false; // число делится на 2 ? Не простое.
  
  let sqrt = Math.sqrt(n); // Незачем проверять все числа до `n`;
                           // Если не нашлись делители до √n, значит число простое.      
  for (let i = 3; i < sqrt; i += 2) { // Четные уже не проверяются. 3, 5, 7, 9...
    if (n % i == 0) return false;
  }
  
  return true;
}

function solution(k) {
  let total = 0;
  
  for (let found = 0, i = k - 1; i >= 2; i--) {
    if (isPrime(i)) {
      total += i; console.log(i, '<<');
      if (++found == 2) break; // Найдено 2 простых числа меньше k;
    }
  }
  
  for (let found = 0, i = k + 1; true; i++) {
    if (isPrime(i)) {
      total += i; console.log('>>', i);
      if (++found == 2) break; // Найдено 2 простых числа больше k;
    }
  }
  
  return total;
}


.indexOf(k) — тоже цикл: Перебирает массив, пока не найдет элемент, равный k. Поэтому этим методом тоже не надо разбрасываться направо-налево. Ваш блок в 4-мя indexOf, при необходимости, можно было переписать так:

let a = arr.indexOf(k) - 1;
let b = arr.indexOf(k) - 2;
let c = arr.indexOf(k) + 1;
let d = arr.indexOf(k) + 2;

let i = arr.indexOf(k);
let a = i - 1, b = i - 2,
    c = i + 1, d = i + 2;
→ Ссылка