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

Scala求最大质因数代码报错:Long类型无法使用.to()运算符

求600851475143的最大质因数及Scala代码报错解决

问题背景

已知13195的质因数为5、7、13和29,求数字600851475143的最大质因数。编写的Scala代码运行时报错,代码如下:

@main def m(): Unit = {
  var largest = 0L;
  val num = 600851475143L;
  2.to(num - 1).foreach(arg =>
    if num % arg == 0 && largest < arg then
      var flag = true;
      2.to(arg - 1).foreach(arg2 =>
        if arg % arg2 == 0 then flag = false);
      if flag then largest = arg;
  )
  println(largest);
}

报错信息

Found: Long
Required: Int
2.to(num - 1).foreach(arg =>)

用户疑问:如何针对Long类型使用.to()运算符?该运算符似乎仅支持Int类型。尝试将Long强制转换为Int,但结果为0,无法解决问题。

解决方案

1. 修复类型不匹配问题

Scala中Int类型的.to()方法仅接受Int类型参数,你的代码中num是Long类型,num - 1同样是Long,导致类型不兼容。解决方法是把起始值改为Long类型,用2L替代2,这样调用的是Long的.to()方法,支持Long参数:

2L to (num - 1)

2. 优化算法(核心改进)

原代码遍历范围是2到num-1,且对每个数都做质数检查,对于600851475143这种超大数,效率极低,几乎无法运行。更高效的方案是用试除法分解质因数:

  • 从最小质数2开始,不断用当前数除以能整除的因数,直到无法整除
  • 递增除数(跳过偶数),重复操作直到除数的平方大于当前数
  • 最后若剩余的数大于1,它就是最大的质因数

优化后的代码:

@main def findLargestPrimeFactor(): Unit = {
  var num = 600851475143L
  var largest = 0L

  // 先处理所有偶数因数
  while num % 2 == 0 do
    largest = 2L
    num /= 2

  // 处理奇数因数,从3开始每次加2
  var i = 3L
  while i * i <= num do
    while num % i == 0 do
      largest = i
      num /= i
    i += 2

  // 剩余的数若大于1,本身就是质因数
  if num > 1 then
    largest = num

  println(largest)
}

代码说明

  • 优先处理偶数因数,避免后续重复检查偶数
  • 仅遍历奇数除数,大幅减少循环次数
  • 每次找到可整除的因数时,直接将原数除以该因数,缩小后续计算范围
  • 当除数平方超过当前数时,剩余数值若大于1,必然是未分解完的质因数

内容的提问来源于stack exchange,提问作者Diwash Mainali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:52:36