Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
У тебя тоже всё верно, почти... 20.10.08 08:57 Число просмотров: 2979
Автор: amirul <Serge> Статус: The Elderman
|
О каких двух числах ты говоришь?
> Суть предложенного мною варианта основана на элементарной > аксиоме: если a/b не является целочисленным, то a не > кратно b. Элементарное решение - для исправления ситуации > (в поставленной задаче) - умножить a на b . -- Простота и > легкость.
Простота? Целое число преобразовать в число с плавающей точкой, разделить его (все еще с плавающей точкой) на другое число, преобразовать результат к целому и только потом сравнить. В данном случае гораздо лучше делить целочисленно и сравнивать остаток с 0. Но!
Это было бы выходом, если бы твой алгоритм давал правильный результат.
Рассмотрим пример для N==6
0. val = 6
1. val не делится на 5, val = 30
2. val не делится на 4, val = 120
3, 4. val делится на 2 и 3
5. Напечатать 120
Но
60/6 ==10
60/5 == 12
60/4 == 15
60/3 == 20
60/2 == 30
60 < 120
Поправить ошибку в твоем алгоритме легко: достаточно домножать не на само число, на которое мы не смогли разделить без остатка (i), а на i / gcd(val, i). Вот только после этого как раз и получится все то же вычисление lcm на каждом шаге :-)
Твой алгоритм бесконечно лучше, чем та чушь, которую я привел в корневом сообщении, просто потому что тут видна мысль. И я уже говорил, что совершенно неважно, что тот алгоритм дает правильный результат, а твой - нет.
> При этом алгоритм легко расширяется. Расширяется КУДА?
> С тем же php элементарно превращается в короткую и быструю > функцию. > Явно более шуструю, чем варианты с использованием НОКов и > НОДов в классическом виде.
(foldl lcm 1 (cdr (build-list 20 values))) ---
Короткая и быстрая.
На C/C++ с GMP будет лишь чуть чуть менее коротко, но зато в несколько раз быстрее.
> function a ($val) { for ($i = $val-1; $i>1;$i--) if > (($val / $i)!= intval($val / $i)) $val*=$i; return $val; } > > Две переменных - значение и текущий делитель. Никаких > запарок, никакой рекруссии. Хех. Рекурсия в большинстве задач гораздо более выразительна, чем итерации, которые как раз и являются запарами. Но если уж мы об этом, то в моем решении ВООБЩЕ нет временных переменных. Как впрочем и рекурсии. Декларативная запись того, что я хочу получить, а уж то что оно наиболее просто реализуется в виде рекурсии (с опимизацией хвостовой рекурсии, которая обязательна для схемы) - это детали реализации.
> Или... "мы с гордостью решаем проблемы, которые сами себе > создаем?" Нет, не так. Просто чуть более глубокое понимание данной конкретной задачи. Стараюсь понять и остальные задачи, которые решаю.
|
|
|