Есть заданное число не больше 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;