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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |