информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модель надежности отказоустойчивой... 
 Ноябрьский перевыпуск октябрьского... 
 Закопать Flash 
 Октябрьские патчи от MS и перевыпуск... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / humor
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
У тебя тоже всё верно, почти... 20.10.08 08:57  Число просмотров: 2325
Автор: 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; }
>
> Две переменных - значение и текущий делитель. Никаких
> запарок, никакой рекруссии.
Хех. Рекурсия в большинстве задач гораздо более выразительна, чем итерации, которые как раз и являются запарами. Но если уж мы об этом, то в моем решении ВООБЩЕ нет временных переменных. Как впрочем и рекурсии. Декларативная запись того, что я хочу получить, а уж то что оно наиболее просто реализуется в виде рекурсии (с опимизацией хвостовой рекурсии, которая обязательна для схемы) - это детали реализации.

> Или... "мы с гордостью решаем проблемы, которые сами себе
> создаем?"
Нет, не так. Просто чуть более глубокое понимание данной конкретной задачи. Стараюсь понять и остальные задачи, которые решаю.
<humor> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2018 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach