2015-07-20 42 views
-7

原题:最后一个翻译从JS到Ruby的奥丁项目

的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) 
+2

没有阅读所有的代码,我可以告诉你,Ruby中没有'++'操作符。你将不得不做一些事情,比如'i + = 1' – saadq

+2

随便看一眼就足以看到结构不匹配。您的Ruby代码中没有**其他**。 – meagar

+0

请不要使用StackOverflow来询问您对同一网站(Odin项目)的每个问题。这是我见过的第四或第五,我认为有一两个人被关闭/删除。 – onebree

回答

1

要回答你最初的问题,所有你失踪是一个else和而不是使用i++你应该使用i += 1

def largestPrimeFactor (n) 
    i = 2 
    while i <= n 
    if n % i == 0 
     n /= i 
    else 
     i += 1 
    end 
    end 
end 

但是这段代码并不是非常“红宝石式”,所以我会提供一些我可能会用到的实现。

有没有必要计算这一点,因为红宝石已经有一种确定素因子的方法。只需要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 

当运行这些不同的实现W/benchmark(也红宝石标准库的一部分),你可以看到巨大的进步

      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) 
1

如果我需要使用这段代码,下面不是真的如何解决这个问题,但这是我如何写出最相似的解决方案。

我使用两种方法使它更易于使用。为了输出答案(我想你在一个不同的问题与挣扎),您将需要运行:

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