Для профессионального разработчика - нет.
> Что касается всего сыра-бора, который развели относительно > поиска наиболее грамотного решения, то применение > супер-пупер алгоритмов для таких простых задач неуместно,
Во первых алгоритм не супер-пупер, а самое логичное решение. Во вторых именно на алгоритм и надо смотреть, а не на решение. Брут-форс - не алгоритм (ну, формально, конечно, алгоритм, но думаю ты понял что я имею в виду).
> особенно для профессионала. Самое лучшее решение - это > быстро написаное и достаточно быстро считающее. Еще
Нет. Собеседование (особенно на senior-позицию) не олимпиада, в которой тебе добавят баллы за любое решение, выдающее правильный результат. Я проводил немало собеседований, но таких задач не задавал вообще, ибо большинство претендентов не могут осилить даже элементарнейшую задачу реверса односвязного списка за O(const) памяти, не говоря уж о задачах, требующих знания ШКОЛЬНОГО курса математики. На собеседованиях пытаются оценить потенциал претендента. То бишь если он чего не знает - научить не проблема, если мозги есть, а вот если нет мозгов - сразу нахрен, даже если знает наизусть всю стандартную библиотеку похапэ.
> профессионал должен выбирать инструментарий, адекватный > решаемой задаче.
Суть таких задач не в том, чтобы ты ее решил любой ценой, а чтобы продемонстрировал свою способность МЫСЛИТЬ. Причем некоторые задачи вообще не имеют "правильного" ответа (круглые канализационные люки) или имеют ответ, который можно только знать (узнать в каком нибудь справочнике), но невозможно угадать (масса боинга, количество заправок, прибыль телеком компаний). Здесь гораздо четче просматривается цель этих задач. Ответить правильно, если ты специально не заучил все цифры из справочников, у тебя нет никакой возможности ПРИНЦИПИАЛЬНО. Поэтому расслабься и начинай думать.
> Что-то ментя это настолько затронуло, что я захотел > проверить насколько я могу ошибиться. Подумал, что этот > алгоритм может считать за время не больше секунды. Ошибся. > Правда чуть оптимизировал исходный алгоритм (выкинул все > непростые), но время не превысило десятых долей секунды. Хехе. Просто перемножить все простые (число Эвклида) недостаточно (к тому же ты выкинул двойку). Число должно делиться не на 2, а на 16, не на 3, а на 9. С ростом N число таких степеней возрастает.
Вот решение на C:
#include <stdio.h>
#include <gmp.h>
int main(int argc, char **argv) {
mpz_t res;
mpz_init_set_ui(res, 1);
for(int x=1; x<=1000; x++) {
mpz_lcm_ui(res, res, x);
};
mpz_out_str (stdout, 10, res);
}; ---
Как видишь оно считает решение той же задачи для N == 1000. Давай на том же собеседовании это будет следующим вопросом :-). Вполне обоснованный вопрос к профессиональному разработчику: насколько легко твое решение следует за изменяющимися требованиями (это, в общем, один из основных вопросов, ибо требования меняются постоянно)
|