You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中统计Long类型范围内奇数个数,遇Int.MaxValue元素数超限错误

解决Scala中Long范围奇数统计的"More than Int.MaxValue elements."错误

问题原因

Scala里的Range(包括Long类型的Range.Long)的size、length、count方法都是基于Int类型实现的,这意味着Range能容纳的元素数量上限是Int.MaxValue。哪怕你用by 2缩小步长,当n足够大时(比如n > 2 * Int.MaxValue + 1),Range的元素个数依然会超出Int的范围,触发More than Int.MaxValue elements.错误。

解决方案:用数学公式直接计算

根本不需要生成Range集合,通过数学规律就能直接得到结果,完全规避元素数量限制的问题:

  • 若要统计**1到n(包含n)**的奇数个数:
    def oddCount(n: Long): Long = {
      (n + 1) / 2
    }
    
    比如n=7时,结果是4(对应奇数[1,3,5,7]);n=6时结果是3(对应[1,3,5])。
  • 若你的实际需求是统计**1到n-1(不包含n)**的奇数个数(匹配你给出的示例n=7输出3):
    def oddCount(n: Long): Long = {
      n / 2
    }
    
    此时n=7时,7/2=3(对应[1,3,5]),符合示例预期。

为什么这个方法更好

这种方式是O(1)时间复杂度,不需要构建任何集合,完全不会受Int范围限制,不管n多大都能正确返回Long类型的结果。

原代码问题分析

你之前的两种尝试:

  • (1L to n by 2L).size:即使步长为2,当n超过2 * Int.MaxValue + 1时,Range的元素个数依然会超过Int.MaxValue,触发错误。
  • Range.Long(1L, n, 1L).count(_ % 2 != 0):count方法需要遍历Range元素,同样受限于Range的元素数量不能超过Int.MaxValue,而且遍历效率极低。

内容的提问来源于stack exchange,提问作者pragmatic learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:07:30