Предисловие
Сегодня я увидел вопрос, который заставил казаться, что было не сложно определить, является ли число основным числом. Поэтому я решил реализовать это.
Структура DOM
<! Doctype html> <html lang = "en"> <head> <meta charset = "UTF-8"> <Title> Рассчитайте первичные числа в пределах 500 и вывод </title> <meta name = "viewport" content = "width = width device, начальная масштаба = 1.0, максимальная масштаба = 1.0, пользовательскую scallable = 0" src = "http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"> </script> </head> <body> <div> <input type = "text" id = "num" value = "> <input type =" id = "upe" value = "propect"> </div> </body> </html> <script> $ (function () {$ ("#отправить"). composite ");}});}); </script>Как показано выше, мы используем функцию isprimenum (num), чтобы определить, является ли она основным числом. Давайте реализуем эту функцию ниже.
Используйте цикл, чтобы определить, является ли он основным числом
Функция isprimenum (num) {for (var i = 2; i <num; i ++) {if (num%i == 0) {return false;}}; return true;}Принцип относительно простой. Постоянно находив остаток с целевым номером с 2 или более, если вы можете получить 0, это означает, что это составное число, а не основное число.
Но этот расчет кажется немного большим
Оптимизировать первый метод
Это очень просто, это в некоторое время реализовано. Тем не менее, кажется, что мы можем оптимизировать это. Нам не нужно преследовать это число и найти остаток. Нам просто нужно провести до половины этого числа, чтобы вычислить, является ли это число основным номером.
Функция isprimenum (num) {for (var i = 2; i <num/2+1; i ++) {if (num%i == 0) {return false;}}; return true;}После фактического измерения скорость действительно была значительно улучшена, но я знаю, что мантисса числа равно или 5, так что это определенно не простое число, поэтому нет необходимости рассчитать его. Давайте оптимизируем это снова
Нет расчетных чисел, чьи мантисса равно или 5
Функция isprimenum (num) {if (! isdual (num)) {return false;} for (var i = 2; i <num/2+1; i ++) {if (num%i == 0) {return false;}}; return true;} функция isdual (num) {var num = num.toString (); num.substring (num.length-1, num.length); return lastnum%2 == 0 || Lastnum%5 == 0? false: true;}Благодаря такой оптимизации мы можем уменьшить количество расчетов и не менее половины числа. (Но фактическое измерение улучшает производительность, потому что такие цифры можно быстро оценить, что они не являются основными цифрами)
Здесь функция substring () обнаружила, что ее нельзя использовать на номерах, но может использоваться только на строках. К сожалению, сначала номер превращается в строку.
Если это не число или целочисленная обработка
Что мне делать, если ввод пользователя не является числом или десятичным знаком? Я быстро написал два метода для его обработки ...
Функция isprimenum (num) {if (! isnum (num)) {return false;} if (! ISInteger (num)) {return false;} if (! Isdual (num)) {return false;} для (var i = 2; i <num/2+1; i ++) {if (num%i == 0) {return false; IsInteger (num) {return num == ~~ num? true: false;} функция isnum (num) {var num = num.toString (); var lastnum = num.substring (num.length-1, num.length); return lastnum%2 == 0 || Lastnum%5 == 0? false: true;}Здесь используются два совета, один для окружения десятичного значения ~ ~ num, а другой - конвертировать строки в числа. +num.
Пожалуйста, прочитайте мой предыдущий пост в блоге "JS притворяется навыки для JavaScript Learning (i) Fungleo"
Это не повышает какую -либо эффективность, а только устраняет вход ошибки расчета. Давайте снова подумаем об этом, есть ли способ быстро определить, является ли это не главным числом?
Удалить числа, которые можно делить на 3 и не рассчитывать
Функция isprimenum (num) {if (! isnum (num)) {return false;} if (! ISInteger (num)) {return false;} if (num == 2 || num == 3 || num == 5) {return true;} if (! Isdual (num)) {return false; af (! isTheTHRE (num) {vater fors; num/5+1; true: false;} функция isnum (num) {return num == +num? true: false;} функция isdual (num) {var num = num.toString (); var lastnum = num.substring (num.length-1, num.length); return lastnum%2 == 0 || Lastnum%5 == 0? false: true;} функция isThree (num) {var str = num.tostring (); var sum = 0; for (var i = 0; i <str.length; i ++) {sum+=+str.substring (i, i+1);}; return sum%3 == 0? false: true;}Здесь мы сначала переводим номер в строку, затем разделили каждый бит строки, добавляем и суммируем, и используем результат и 3, чтобы найти оставшиеся, а затем мы можем выяснить, можно ли разделить это число на 3.
Ха -ха, я такой умный ... фактическая тестовая производительность не значительно улучшилась, но это действительно немного улучшилось. Это немного подавлено
Однако, если мы исключим 3-разумное число, то нам не нужно рассчитать половину. Нам не нужно рассчитывать половину, нам нужно рассчитать только одну треть. Кроме того, мы также исключили 5, поэтому нам просто нужно рассчитать одну пятую ...
После быстрых корректировок эффективность была значительно улучшена !!! Я могущественен ...
Однако, таким образом, код будет определять, что это составное число в 2/3/5. Поэтому необходимо добавить другое предложение.
if (num == 2 || num == 3 || num == 5) {return true;}Методы других людей
Тогда я не мог придумать метод оптимизации ... поэтому я искал и нашел следующее решение. Я был шокирован !!!
Функция isprimenum2 (num) {return!/^.? $ |^(..+?)/1+$/. Тест (массив (num+1) .join ('1'))}}}}Регулярный метод используется, он действительно короткий, но я могу понять его, даже если я прочитал его !!!
Я действительно не понимаю, каков этот принцип, поэтому я сдал практическое тест и обнаружил, что эффективность моего кода намного выше, чем этот код. Из этого мы видим, что мой метод все еще очень превосходен !!
Для моего кода требуется 1600 мс для печати всех основных номеров в пределах 100000, и этот код занимает 160000 мс. То есть мой код занимает только один процент времени.
Однако, если кто -то может понять этот код, пожалуйста, объясните мне это ...
Пополнить
После прочтения какой -то связанной информации кажется, что метод, который я использовал NUM/5 выше, не очень хорош (результат не ошибается). Существует лучший способ использовать Math.sqrt (num), чтобы найти квадратный корень.
Результаты теста моего кода следующие
Как показано на рисунке выше, результат расчета моего кода полностью верен. Тем не менее, это заняло 1638 миллисекунд. Это все еще так, как после многих тестов.
Результаты испытаний метода Square Root заключаются в следующем
Как показано на рисунке выше, этот метод более научный и быстрее. Это занимает несколько тестов, и это требует от 1150 миллисекунд до 1250 миллисекунд. По сравнению с показателями моей кода, это около 25%.
Я также сужу, являются ли цифры равномерными или 5, и может ли сумма быть разделена на 3, что было много времени. Я определенно надеюсь сократить количество операций. Но сами эти коды также имеют количество операций. Я удалю весь свой код, а затем посмотрю на него.
Производительность снова была улучшена. Кажется, что все мои расчеты негативно оптимизированы!
Наконец, код выглядит следующим образом:
Функция isprimenum (num) {if (! isnum (num)) {return false;} if (! IsInteger (num)) {return false;} for (var i = 2; i <= math.sqrt (num); i ++) {if (num%i == 0) {return false;}}; return true;} num num num num num num num num num num num num num num == num num num num num num num num num num num num num num num num num num num num num num num wum) true: false;} функция isnum (num) {return num == +num? Верно: false;}Резюме: Это было полностью из -за моей бедной арифметики, которая привела меня к умной спереди. Тем не менее, практика небольших методов также хороша -_- |||
Наконец, давайте посмотрим, сколько времени требуется, чтобы рассчитать все основные цифры в течение 1 миллиона.
Выше приведено краткое изложение методов оценки того, является ли число основным числом, введенным редактором. Я надеюсь, что это будет полезно для всех.