- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Для повышение разряда в говнокодинге периодически решаю разные задачки и вот наткнулся на очередную:
// НОК двух чисел - это самое маленькое число, которое делится и на одно, и на второе число. Пример: числа 12 и 15 имеют НОК 60.
// Число 60 делится и на 12, и на 15 и это самое минимальное такое число.
подумал пару минут и написал так
$start = microtime(true);
for ($a=1;$a<=1000000000000000;$a++){
$pervoe = $i*$a;
if ($pervoe % $n == 0){
echo "НОК=".$pervoe."<br>";
$finish = microtime(true);
$delta = $finish - $start;
echo $delta . ' сек.';
break;
}
}
}
Nok(1467,146000000);
//НОК=214182000000
//94.320394992828 сек.
проверил на малых числах, вроде работает. Загнал одним из чисел 146 млн. и ждал почти 100 сек. ответ.
Потом пишу сыну (он у меня на питоне кодит) - типа реши задачку. Он посмотрел и говорит - алгоритм Эвклида для этого есть, лучше не придумаешь.
Полез искать что за зверь, нашел решение на пхп
$num = $a;
$div = $b;
/* Euclid Algorithm */
while (true) {
$rem = $num % $div;
$num = $div;
$div = $rem;
if ($rem == 0) break; // no remainder?
}
return $num;
}
/* Least Common Multiple */
function lcm($a, $b) {
return $a * $b / gcd($a, $b);
}
$stat = microtime(true);
echo lcm(1467,146000000)."<br>";
$finish = microtime(true);
$delta = $finish - $stat;
echo $delta . ' сек.';
//НОК=214182000000
//0.00099992752075195 сек.
Восхитился математиками и математикой, но есть 2 вопроса:
1. почему какие бы числа я не загонял во второй код, он решает все почти мгновенно, вообще нет разницы сотни или миллиарды с триллионами?
2. почему microtime во втором коде сбоит и почти всегда показыает просто 0. (я перед каждым выполнением перезагружаю опенсервер) 1 раз покажет время, 10 раз - просто ноль, хотя цифры ввожу разные, результат показывает. Думал кеширует, но я то код меняю и серв перезапускаю, как так?
1. А что ты хотел увидеть на нескольких итерациях? На примере из стартпоста - 7 итераций, если воткнуть lcm(1467111111111111,14622222222222222222) - 22 итерации. Это мизер.
2. Смотри п.1.
1. почему какие бы числа я не загонял во второй код, он решает все почти мгновенно, вообще нет разницы сотни или миллиарды с триллионами?
Во втором варианте каждая последующая интерация цикла уменьшает числовой диапазон.
Представьте пирамиду. Первая итерация - это дно пирамиды, последняя - вершина.
В первом же варианте линейное решение.
Представьте квадрат, вы движитесь со дна к вершине не уменьшая числовой диапазон.
Dram, откройте для себя форматирование кода, разряд в говнокодинге повысится.
1. почему какие бы числа я не загонял во второй код, он решает все почти мгновенно, вообще нет разницы сотни или миллиарды с триллионами?
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%95%D0%B2%D0%BA%D0%BB%D0%B8%D0%B4%D0%B0#%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0
https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C