2015-07-20 40 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