测试Ints的可分性为11

时间:2010-10-21 17:13:32

标签: math haskell division

我现在正在努力解决这个问题。我想确定一个整数是否可以被11整除。从我所读到的,一个整数可以被11整除,当它的数字的总和(一次+,一次 - )可以被11整除时。

例如:56518可以被11整除,因为8-1 + 5-6 + 5 = 11,11可以被11整除。

我怎样才能在Haskell中写下这个?提前谢谢。

4 个答案:

答案 0 :(得分:14)

x如果除以y的余数为0,则y可被divisibleBy11 x = x `rem` 11 == 0 整除。所以你可以这样做

{{1}}

答案 1 :(得分:7)

ifan我确定你知道在现实生活中你会使用modrem这个简单的例子,但你要问的算法很有趣。这是一种有趣的方式来强调Haskell的功能性:

digits = map (`mod` 10) . takeWhile (> 0) . iterate (`div` 10)

divisible11 = (== 0) . head . dropWhile (>= 11) . iterate (reduce11 . digits)
  where
    reduce11 []     = 0
    reduce11 (d:ds) = foldl combine d $ zip (cycle [(-), (+)]) ds
    combine d (op, d') = d `op` d'

答案 2 :(得分:2)

当然,divmod速度更快,但为什么不呢?我假设问题是将数字转换为数字列表:

toDigits = map (read . (:[])) . show

56518转换为字符串"56518",字符串中的每个符号(每个数字)都会转换为带有map (:[])的字符串,此时我们有{{1}我们将每个单位数字符串作为整数值读取:["5","6","5","1","8"]。完成。

现在我们可以用这种方式计算数字的总和:

[5,6,5,1,8]

sumDigits x = sum (zipWith (*) (cycle [1,-1]) (reverse (toDigits x))) 创建一个无限列表cycle [1,-1],我们将其与反转的数字列表([1, -1, 1, -1, ...])配对,并将每对的元素相乘。所以我们有toDigit x及其总和。

现在我们可以递归地执行:

[8, -1, 5, -6, 5]

答案 3 :(得分:0)

怎么样......

mod11 n | n < 0 = 11 - mod11 (-n) 
        | n < 11 = n
        | otherwise = mod11 $ (n `mod` 10) - (n `div` 10)