Как написать операцию gcd(x : Integer, y : Integer) : Integer
, которая возвращает наибольший общий делитель из двух натуральных чисел (наибольшее целое число, которое их разделяет точно) в ocl
?наибольший общий делитель в ocl
0
A
ответ
0
Вот простое решение для этого (конечно, не эффективен, но он работает):
let divs : Sequence(Integer) = if x < y then Sequence{1..y} else Sequence{1..x} endif
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
Что просто сделать то, что последовательность каждого кандидатов потенциалов генерируется, то из этой последовательности, только те, которые делят x
и y
, выбираются и сохраняются в новой последовательности (которая упорядочена). Наконец, последнее число из этой отфильтрованной последовательности - ваш наибольший общий делитель.
Теперь в деталях:
- мы производим последовательность с
Sequence{a..b}
- эта последовательность переходит из
1
к большему числу междуx
иy
(if x < y then Sequence{1..y} else Sequence{1..x}
) - эта последовательность хранится в неизменны переменная
divs
(let divs : Sequence(Integer) = ... in ...
) - от
divs
, мы выбираем только номерz
, который является делителем дляx
иz
(divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)
- наконец, мы только взять последний элемент из новой последовательности (
select(...)->last()
)
Если функция last()
не существует в вашем окр (не знаю, почему, но некоторые OCL реализации приносят свои собственные функции), вы можете использовать:
->sortedBy(i | -i)->at(1)
вместо last()
, которые в обратном порядке и принять первый элемент.
EDIT>
Вы также можете привести выражение таким образом:
let divs : Sequence(Integer) = Sequence{1..x.max(y)}
in divs->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
или путем удаления использования divs
Sequence{1..x.max(y)}->select(z | x.mod(z) = 0 and y.mod(z) = 0)->last()
Смежные вопросы
- 1. найти наибольший общий делитель
- 2. NASM Наибольший общий делитель
- 3. C# найти наибольший общий делитель
- 4. Java: получить наибольший общий делитель
- 5. Используя наибольший общий делитель удовольствия
- 6. Как этот метод определяет наибольший общий делитель?
- 7. R - наибольший общий делитель dplyr-режим
- 8. Найти наибольший общий делитель во время компиляции
- 9. код наибольший общий делитель ничего не выводит
- 10. JS как найти наибольший общий делитель
- 11. Как выполнить Modulo наибольший общий делитель?
- 12. Самый большой общий делитель
- 13. Попросите два целых числа получить наибольший общий делитель (GCD)?
- 14. Определите наибольший общий делитель (GCD) двух значений, используя алгоритм Евклида
- 15. Как найти наибольший общий делитель двух чисел, используя цикл for?
- 16. Euclidean наибольший общий делитель для более чем двух чисел
- 17. Как реализовать наибольший общий делитель для упрощения фракций
- 18. Наибольший делитель N (исключая себя)
- 19. Как найти самый общий общий делитель?
- 20. C++ Самый большой общий делитель
- 21. Найти и показать наибольший общий делитель из 2 входных чисел в NASM
- 22. Устный перевод [R] Наибольший общий делитель (GCD) (и LCM) в пакете {numbers}
- 23. Полиномиальный величайший общий делитель C++
- 24. Самый большой общий делитель (GCD)
- 25. Рекурсивный наибольший общий знаменатель объяснение
- 26. схема - показать все пары элементов, которые имеют наибольший общий делитель 1
- 27. найти наибольший общий делитель (назначение misgraded, я отчаянно нужна ваша помощь)
- 28. Самый большой общий делитель в Clojure
- 29. Найти наименьший общий делитель в делители массиве
- 30. найти наибольший простой делитель (самый быстрый программы возможно)
ли это поддержка в стандартном OCL? каков набор результатов или возврата? – any
Я проверил, 'last()' является стандартным OCL (спецификация, стр.170). Это был единственный момент, о котором я не знал. Все остальное очевидно стандартно. Это выражение не работает для вас? –
Bytheway, вы можете уменьшить выражение (см. Мое редактирование), и все по-прежнему является стандартным OCL. –