【问题标题】:Sum of large list or range goes beyond the scope大列表或范围的总和超出范围
【发布时间】:2014-06-19 17:02:34
【问题描述】:

我在玩 groovy,写了简单的一行程序:

groovy -e "(1..100_000).each{println((1..it).sum())}"

结果通过 '>' 通过管道传输到文件。

我有两个主要问题:

  1. 耗时太长(我对比了类似的python脚本)
  2. 输出超出范围,一段时间后我的总和变为负数

我怎样才能加速执行并在总和结果中有 long 或 bigint。

【问题讨论】:

    标签: groovy


    【解决方案1】:

    所以,您已经回答了问题的第 2 部分。为了让它运行得更快,你可以递归地定义你的逻辑并利用memoization

    groovy -e "@groovy.transform.Memoized c(BigInteger i) { i == 1 ? 1 : c(i - 1) + i }; (1..100_000).each { println c(it) }"
    

    【讨论】:

    • 它,有效,但它不是基于 sum() 函数的解决方案,我很好奇为什么 python 的 sum() 更快,但你的答案很好很有趣:)
    • sum() 性能已经在这里讨论过:stackoverflow.com/questions/24009708/…
    【解决方案2】:

    我发现了如何确定范围内的数字,只要不是 int:

    groovy -e "(1..100_000).each{println((1..(it as long)).sum())}"
    

    或使用 BigInteger:

    groovy -e "(1..100_000).each{println((1..it).sum(0G))}"
    

    仍然不知道性能问题,如果我可以做些什么来加速这个脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2018-10-31
      • 2015-03-03
      • 1970-01-01
      • 2015-09-11
      相关资源
      最近更新 更多