【发布时间】:2020-11-12 14:54:01
【问题描述】:
我正在 Codewars 中解决 Last digit of a huge number。
我设法找到了计算odd number ^ odd number 和odd number ^ even number 的方法。但是我被困在even ^ even/odd,因为数字和它的力量模型之间的关系并不明显。
这是我设法得到的:
lastDigit :: [Integer] -> Integer
lastDigit = (`rem` 10) . go
where
go [] = 1
go [x] = x
go (x : y : r)
| odd x && odd y = x ^ (go (y : r) `rem` (x + 1))
| odd x && even y = x ^ (foldMod y (go r) (x + 1))
| otherwise = -- any hint?
foldMod :: Integer -> Integer -> Integer -> Integer
foldMod _ 0 _ = 1
foldMod base 1 modulo = base `rem` modulo
foldMod base power modulo = (base * foldMod base (power -1) modulo) `rem` modulo
任何人都可以提供一些关于如何处理偶数情况的提示吗?
【问题讨论】:
-
提示:
(a * b) mod c = (a mod c) * (b mod c) mod c -
您实际上可以计算 O(1) 中的最后一位数字(假设您可以在 O(1) 中进行取模,通过分析如何反复相乘最终会产生一个“循环”。
-
你能用文字说出你打算
go计算什么函数吗?我已经盯着它看了一段时间,但还没有说服自己当前的方程对于任何明显的解释都是正确的。 -
@DanielWagner 是的,在重新考虑并尝试其他一些方法后,我也发现我的方法有问题 T_T
-
@WillemVanOnsem 我不相信这可以在 O(1) 中完成。考虑
lastDigit (replicate n 0)的奇数与偶数n。