Какой вариант решения лучше?
chatGPT удтверждает что решение №2 лучше в плане эффективности и читаемости.
Пример №1
function checkPrime(n) {
if (n % 2 == 0)
return false;
const sqrtN = Math.sqrt(n);
for (let div = 3; div <= sqrtN; div += 2) {
if ( (n % div) == 0) {
return false;
}
}
return true;
}
function minimumNumber(numbers) {
let sum = numbers.reduce((sum, number) => sum + number, 0);
let min;
for (min = 0; !checkPrime(sum + min); min++);
return min;
}
Пример №2
function isPrime(n){
for(var i = 2; i<=Math.sqrt(n); i++)
if (n%i==0)
return false;
return n > 1;
}
function minimumNumber(numbers){
for(var i = 0, n = numbers.reduce((p,c) => p+c); !isPrime(n+i); i++) {}
return i;
}
новая которая на сайте o3-mini? на самом деле это немного урезанная версия, есть платная o3-mini high, говорит что, типо, первый вариант немного ошибочный, но если исправить ошибку то норм, а второй не очень эффективный из-за цикличного перебора, но, мол, для типичных входных данных (как в задачах типа Codewars) разница несущественна. по итогу он сказал что лучше всё же первый если доработать, ну а второй разве что просто красивее выглядит
В плане читаемости оба плохи, хотя первый лучше. Хотя это ему не поможет. А добиваться эффективности в яваскрипте такое себе занятие.
Оба хуже.
По асимптотической сложности - одинаково неэффективно.
За вот такое на каждой итерации цикла в серьёзных проектах по рукам дают: i<=Math.sqrt(n)
Об ошибке в checkPrime тебе уже сказали.
Многократная проверка чисел на простоту делается либо решетом Эратосфена, либо, как минимум, предварительным расчётом простых делителей. Каждый раз перебирать все нечётные числа - сгодится разве что одноразовой домашки для учителя из тех, кто задают суммировать арифметическую прогрессию циклом.
Второй вариант ужасен, т.к. в нём Math.sqrt(n) заново вычисляется на каждой итерации цикла. А это совсем не быстрая операция. И сам цикл делает вдвое больше итераций, чем требуется. Никакой эффективности в помине нет.
Первый же вариант ошибочен, т.к. n == 2 он НЕ считает простым числом. Если это исправить, первый вариант будет многократно лучше.
это что