【问题标题】:Summing the digits of a very large number [closed]将一个非常大的数字的数字相加[关闭]
【发布时间】:2016-08-21 01:28:06
【问题描述】:

我想对饼图的前 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

我想为我所有的 10 万位数字都这样做

但我想在此之上添加另一个转折

我想在 x 次循环后打印结果(循环我的意思是像上面的示例中分配 j,j1,j2,j3 和 3,1,4,1 将是第一个循环)以及最终结果。

我更喜欢python或haskell等简单的语言

【问题讨论】:

  • 哇,我以前从未听过有人称 Haskell 是一种简单的语言。 :)
  • 我不掌握它(显然),但我发现它比 C++ 或 java 更直观和“宽容”......:P
  • Haskell- 让困难的事情变得简单,让简单的事情变得困难。 :)

标签: python arrays haskell largenumber


【解决方案1】:
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 

【讨论】:

  • 谢谢,但我的问题的很大一部分是如何插入我的 100k 数字我以 txt 格式保存它们,那么我如何将“my_digits”链接到该文件?还是有一种明智的方法可以让 python 在将 pi 填充到垃圾箱时逐位计算 pi?
  • my_digits = iter(lambda:my_open_file.read(1),None)
【解决方案2】:

这将是 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

我将在今天晚些时候更新此内容并提供一些解释。

更新@评论

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

【讨论】:

  • 谢谢,我想我知道这里发生的大部分事情:D 对我来说只有“模糊”的东西是“(zipWith(+))”我想这会添加每个落在单个块​​上的数字?
  • exacly zipWith (+) [1,2,3,4] [5,6,7,8] =&gt; [6,8,10,12] 请注意,如果一个列表比另一个列表短 zipWith 会将结果列表缩小到较小的大小,因此您也可以处理无限列表 zipWith (+) [1] [1..] =&gt; [2]
  • 我还没有运行代码(当我回家时会很快运行并在必要时提供反馈,或者如果一切顺利,则选择此作为答案)我只是对打印有疑问对我来说,结果将是每个块的总和列表,而我需要更多的东西(假设前 100 个“zipWith”s
  • 另外,如果我想在 parraler 中做另一个 zipWith (例如,一个添加 4 块,一个添加块,比如说 8,然后另一个 12 等,并打印所有结果包括中间结果)我怎样才能一次完成所有工作而不是多次运行代码?我可以添加像 let summator = foldl2' (zipWith (+)) 这样的行吗? chunksOf 8 让 summator = foldl3' (zipWith (+)) 。 chunksOf 12 然后prin会是什么样子(还要记住我上面提到的“中间结果”
  • 很抱歉格式不好仍然没有弄清楚如何在评论部分绘制新行:P我是新来的stuckoverflow:P
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2012-11-05
相关资源
最近更新 更多