奥丁项目的JS到Ruby的最后一个翻译
One final translation from JS to Ruby for The Odin Project
原始问题:
13195的素数是5、7、13和29。
600851475143这个数字的最大素数是什么?
这是我在JS中的答案:
function largestPrimeFactor(n){
var i=2;
while (i<=n){
if (n%i == 0){
n/=i;
}else{
i++;
}
}
console.log(i);
}
var a = 600851475143;
largestPrimeFactor(a)
我花了几个小时试图弄清楚如何在Ruby中做到这一点,以下是我的想法,但我无法让它发挥作用:
def largestPrimeFactor (n)
i = 2
while i <= n
if n % i == 0
n /= i
i++
puts i
end
end
end
a = 600851475143
puts largestPrimeFactor(a)
如果我需要使用这段代码,下面并不是我将如何解决这个问题,但这是我将如何编写与您所拥有的最相似的解决方案。
我用了两种方法使它更容易使用。要输出答案(我认为你在另一个问题中遇到了困难(,你需要运行:
puts largest_prime_factor(600851475143)
这是代码:
def largest_prime_factor(input)
i = 1
while i < input
input /= i if (is_prime?(i) && input%i == 0)
i += 1
end
input
end
def is_prime?(num)
(2...num).each {|i| num%i == 0 ? false : true}
end
要回答您最初的问题,您所缺少的只是一个else
,而不是使用i++
,您应该使用i += 1
。
def largestPrimeFactor (n)
i = 2
while i <= n
if n % i == 0
n /= i
else
i += 1
end
end
end
然而,这段代码并不是很"ruby式",所以我将提供一些我可能会使用的实现。
没有必要计算这个,因为ruby已经有了确定素数的方法。只需要prime
,它是ruby标准库的一部分。
require 'prime'
def largestPrimeFactor(n)
primes, _ = n.prime_division.transpose
primes.max
end
largestPrimeFactor(13195) # => 29
largestPrimeFactor(600851475143) # => 6857
此方法(以及您的原始JS代码(的唯一缺点是不使用所谓的内存化,因此多次使用相当大的数字调用largestPrimeFactor
可能会导致计算浪费。我们可以通过使用我的解决方案的稍微复杂一点的版本来解决这个问题:
require 'prime'
def largestPrimeFactor(number)
@largest_prime_factor ||= {}.tap do |hash|
hash.default_proc = proc do |_, key|
hash[key] = begin
primes, _ = n.prime_division.transpose
primes.max
end
end
end[number]
end
largestPrimeFactor(13195) # => 29
largestPrimeFactor(600851475143) # => 6857
当使用benchmark
(也是ruby标准库的一部分(运行这些不同的实现时,您可以看到的巨大改进
user system total real
JS port 0.030000 0.000000 0.030000 ( 0.036535)
without memozation 0.020000 0.000000 0.020000 ( 0.017466)
with memozation 0.000000 0.000000 0.000000 ( 0.000199)
相关文章:
- 无法获取vis.js最后一个或第一个选定的网络节点
- Knockout JS单选按钮如果所有值都为true,则选择最后一个按钮
- async.js在使用瀑布方法时返回最后一个值
- 添加一个“;以及“;到String-js/Angular中的最后一个单词
- JS:最后一个输入元素的名称(HTML/PHP)
- (JS)如何删除动态创建的最后一个元素
- JS将对象推送到变量,将最后一个对象添加到所有元素中
- MongoDB获取最后一个元素不能在node.js上正常工作
- 匹配 js 正则表达式中的最后一个匹配项
- 启用最后一个 JS 函数时动态下拉窗体中断
- D3.js .rangeBands() 返回“undefined”,只有最后一个值
- React JS:setState 在最后一个输入时很晚
- 角度.js在 ng-repeat 中获取 2d 数组中最后一个元素的索引
- 如何使用 JS 正则表达式将文本块中的每个最后一个字母都设置为粗体
- JS/JQuery-如果空格是第一个和/或最后一个字符,则从输入字段中删除空格
- 使用JS获取最后一个历史项目URL
- 如何在保持第一个和最后一个字符相同的情况下对单词进行加扰?(JS)
- JS删除最后一个子项
- 删除字符串JS最后一个字母之后的所有字符
- bootstrap modal.js最后一个完整按钮丢失