我现在正在努力解决这个问题。我想确定一个整数是否可以被11整除。从我所读到的,一个整数可以被11整除,当它的数字的总和(一次+,一次 - )可以被11整除时。
例如:56518可以被11整除,因为8-1 + 5-6 + 5 = 11,11可以被11整除。
我怎样才能在Haskell中写下这个?提前谢谢。
答案 0 :(得分:14)
x
如果除以y
的余数为0,则y
可被divisibleBy11 x = x `rem` 11 == 0
整除。所以你可以这样做
{{1}}
答案 1 :(得分:7)
ifan我确定你知道在现实生活中你会使用mod
或rem
这个简单的例子,但你要问的算法很有趣。这是一种有趣的方式来强调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)
当然,div
和mod
速度更快,但为什么不呢?我假设问题是将数字转换为数字列表:
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)