加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala找到最小的立方体,其数字的五个排列正好是立方体

发布时间:2020-12-16 08:43:34 所属栏目:安全 来源:网络整理
导读:我遇到了这个很棒的问题,并尝试用 scala解决它以学习语言.问题的简短解释在标题中,这是一个更长的解释 http://www.mathblog.dk/project-euler-62-cube-five-permutations/. 我在Javascript中解决了它,并试图将逻辑转移到scala,但它不太有用.它适用于查找3个
我遇到了这个很棒的问题,并尝试用 scala解决它以学习语言.问题的简短解释在标题中,这是一个更长的解释 http://www.mathblog.dk/project-euler-62-cube-five-permutations/.

我在Javascript中解决了它,并试图将逻辑转移到scala,但它不太有用.它适用于查找3个排列而不是4,5和可能向上.

这是代码:

import collection.mutable.Map
import collection.mutable.{Map => MMap}

val mutMap3 = MMap.empty[String,MMap[String,Int]]
def pow(n:Int) : Int =  { 
  val cubed = (n * n * n).toString
  val digits = 0 to 9
  var str = ""
  for (a <- digits) {
    val b = cubed.count(_.toString==a.toString)
    str += b
  }
  if (mutMap3 contains str) {
    mutMap3(str)("len") += 1
    if(mutMap3(str)("len") == 5) {
      return mutMap3(str)("first")
    }
  } else {
    mutMap3(str) = MMap("len" -> 1,"first" -> n)
  }
  return pow(n+1)
}

我的想法是,由于排列只是顺序的重新排列,(即4233是3234的排列),那么你可以只计算每个数字出现的次数,这将代表所有可能的排列.在4233的排列中,“0”出现0次,“1”出现0次,“2”出现2次,“4”出现1次,“5”出现0次……等等一直到9次,可以将字符串“012100000”作为“0012100000”放入字符串中,“4234和3234”以及“2”,“3”和“4”的所有其他组合可以表示为“ 0012100000” ).所以用简单的英语,取一个数字,立方体,把它变成一串特定整数的出现,存储它并计算我们看到它的次数,因为我们继续用数字1调用函数,直到特定的排列发生5次,然后从我们第一次获得该排列时返回该数字.

我想看看替代方法,但我真的想知道为什么我的工作无效以及它是否是一个好方法.玩得开心!

解决方法

不是特别有效但简洁:

scala> val cubes=(0 to 5030).map(c=>c.toLong*c*c).toSet

cubes: scala.collection.immutable.Set[Long] = Set(2628072,...

scala> cubes.par.filter(_.toString.permutations.map(_.toLong).filter(cubes.contains(_)).length==5)

res6: scala.collection.parallel.immutable.ParSet[Long] = ParSet(38614472000,10648000000,10403062487,91125000000,65939264000,54439939000,95443993000,122763473000,116500279104,114791256000,40920960536,103823000000)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读