由买买提看人间百态

topics

全部话题 - 话题: tworaise
(共0页)
t*s
发帖数: 1504
1
计算2的10000次方所有数字之和
-- 2的0次方是1
initial = 1:[0,0..]
tworaise :: Int -> [Int]
tworaise 0 = initial
tworaise x = double.tworaise $ x-1
double :: [Int] -> [Int]
double l = zipWith (+) [t*2 `mod` 10 | t<-l] (0:[t*2 `quot` 10 | t<-l])
main=do
print.sum.take 10000 $ tworaise 10000

1000次方很快能算出来。10000就不行了。这都搞不定还搞屁啊。
a*****e
发帖数: 1700
2
你这个算法写得不是特别好,造成最后要 take N, 然后还要预估一个 N
为什么不从 most significant digit 开始排呢?这样也用不着 [0,0..]
我给你改了一下
initial = [1]
tworaise :: [[Int]]
tworaise = initial : map double tworaise
double :: [Int] -> [Int]
double = dropWhile (==0) . foldr f [0]
where
f !d ((!x):xs) =
let (q, r) = (d * 2) `quotRem` 10
in q:r+x:xs
main = print $ sum $ tworaise !! 10000
运行起来是这样的:
bash-4.2$ ghc -XBangPatterns -O2 test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test ...
bash-4.2$ time .... 阅读全帖
(共0页)