对一个非常大的数的数字求和

Summing the digits of a very large number

我想对饼图的前 100.000 位数字求和(我有带数字的文本), 但我想以特定的形式进行。

我想将数字放在一个矩阵(或任何方便的占位符)中,其中包含我预定义的少量单元格,并与这些单元格中的数字重叠。

我的意思是:假设我们有这个数字列表 (31415926535)

假设我们有 4 个单元格 j、j1、j2、j3

在第一个 运行 j=3,j1=1,j2=4,j3=1 中,注意每个单元格都分配有列表中的数字和剩下的数字列表是(5926535)所以我想重叠它们以便 j=8(因为它的值为 3,现在加上 5),j1=10 (1 + 9) , j2=6 j3=7

我想为我所有的 100k 数字都这样做

但我想在此基础上添加另一个转折点

我想在 x 个周期后打印结果(周期我的意思是一个 运行 就像在上面的例子中分配 j,j1,j2,j3 与 3,1,4,1 将是第一周期)以及最终结果。

我更喜欢简单的语言,例如 python 或 haskell

bins = [0,0,0,0] # four bins
for i,n in itertools.izip(itertools.cycle([0,1,2,3]),my_digits):
    bins[i] += int(n)

我猜...有时打印出来

bins = [0,0,0,0] # four bins
num_bins = 4
for i,n in enumerate(my_digits):
    bins[i%num_bins] += int(n)
    if i % 100: print( bins ) # every 100 items print 

这将是 Haskell

中的完整实施
import Data.List.Split (chunksOf)
import Data.List
import Data.Char (digitToInt)

main :: IO ()
main = do digits <- map digitToInt <$> readFile "pifile.txt"
          let summator = foldl1' (zipWith (+)) . chunksOf 4
          print $ summator digits

今天晚些时候我会更新这篇文章并进行一些解释。

更新@Comments

main = do digits <- map digitToInt <$> readFile "pifile.txt"
              let summator = scanl1' (zipWith (+)) . chunksOf 4
              mapM_ print $ take 100 $ summator digits