使用gcd相当容易,但我不明白如何配合所有功能,以实现它没有。
kgv :: Int -> Int -> Int
kgv x y = abs ((x `quot` (gcd x y)) * y)
我得到了这个函数来找到有效的素数因子(prime_factors
),我正在研究一个函数,它从一个列表中获取最大数,并检查它是否在另一个列表中{{1} }):
comp
答案 0 :(得分:3)
这是我正在讨论的(非常)天真的算法:
kgv :: (Ord a, Num a) => a -> a -> a
kgv x y = find x y
where find i j
| i == j = i
| i < j = find (i+x) j
| i > j = find i (j+y)
它基本上是学童会做的事情;)
警告我忽略了负数和0 - 你可能不得不处理那些
答案 1 :(得分:3)
或许另一种简单的方法是
import Data.List(intersect)
lcm m n = head $ intersect (series m n) (series n m)
where series a b = take a $ map (*b) [1..]
答案 2 :(得分:3)
这是一个荒谬简单且极其低效的解决方案:
lcm m n = head [x | x <- [1..], x `rem` m == 0, x `rem` n == 0]
当然,这依赖于两种不同的概念,即#34;最少&#34;在他们这样做的情况下重合。一个完全天真的解决方案似乎不可能。
答案 3 :(得分:0)
我大部分都是自己想的。感谢您的想法和指示。
ggt n m | n > m = maximum [t | t <- [1 .. m], gt n m t]
| otherwise = maximum [t | t <- [1 .. n], gt n m t]
gt n m c = t n c && t m c
t n c | n >= c = (mod n c == 0)
| otherwise = False
kgv :: Int -> Int -> Int
kgv x y |x==0=0|y==0=0 |otherwise = abs ((x `quot` (ggt x y)) * y)