Top.Mail.Ru
Ответы

Какой вариант решения лучше?

chatGPT удтверждает что решение №2 лучше в плане эффективности и читаемости.

Пример №1

1234567891011121314151617181920212223
 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

12345678910111213
 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; 
} 
Анонимный опрос
Первый вариант
Второй вариант
Всего голосов: 9
По дате
По рейтингу
Аватар пользователя
Мыслитель
4мес

новая которая на сайте o3-mini? на самом деле это немного урезанная версия, есть платная o3-mini high, говорит что, типо, первый вариант немного ошибочный, но если исправить ошибку то норм, а второй не очень эффективный из-за цикличного перебора, но, мол, для типичных входных данных (как в задачах типа Codewars) разница несущественна. по итогу он сказал что лучше всё же первый если доработать, ну а второй разве что просто красивее выглядит

Аватар пользователя
4мес

В плане читаемости оба плохи, хотя первый лучше. Хотя это ему не поможет. А добиваться эффективности в яваскрипте такое себе занятие.

Аватар пользователя
Высший разум
4мес

Оба хуже.
По асимптотической сложности - одинаково неэффективно.
За вот такое на каждой итерации цикла в серьёзных проектах по рукам дают: i<=Math.sqrt(n)
Об ошибке в checkPrime тебе уже сказали.

Многократная проверка чисел на простоту делается либо решетом Эратосфена, либо, как минимум, предварительным расчётом простых делителей. Каждый раз перебирать все нечётные числа - сгодится разве что одноразовой домашки для учителя из тех, кто задают суммировать арифметическую прогрессию циклом.

Аватар пользователя
Высший разум
4мес

Второй вариант ужасен, т.к. в нём Math.sqrt(n) заново вычисляется на каждой итерации цикла. А это совсем не быстрая операция. И сам цикл делает вдвое больше итераций, чем требуется. Никакой эффективности в помине нет.

Первый же вариант ошибочен, т.к. n == 2 он НЕ считает простым числом. Если это исправить, первый вариант будет многократно лучше.

Аватар пользователя
Профи
4мес

это что