2016-12-30 5 views
0

최대 소수 소수 오일러 문제에 대한 작업. for 메소드는 인자의 배열을 살펴보고 소수가 맞는지 테스트합니다.루비가 배열을 건너 뛰는 중 건너 뛰는 것 같습니다

숫자가 작을 때는 작동하지만 테스트 번호 (600851475143)의 경우 소수가 아닌 요소 (104441)가 하나 있지만 for 메서드는 건너 뜁니다. 다른 비 소수는 제거되고 실제 소수는 유지됩니다. 그러나이 한 숫자는 어떤 이유로 건너 뛰기 시작합니다.

나는 루비가 프라임 (Prime) 방법을 가지고 있다는 것을 알고 있으며, 나는이 문제를 푸는 더 웅장한 방법이 있다고 확신한다. 그러나 이것은 정말로 나를 귀찮게했다. 도와 주셔서 감사합니다. 고맙습니다.

def make_array(num) 
    array = [] 
    factors_array = [] 
    prime_array = [] 
    test_array = [] 
    x = 1 
    while x <= Math.sqrt(num) #makes array of odd numbers below square root of number 
     array << x 
     x += 2 
    end 

    array.each do |x| #gets factors of number from array 
     next if num % x != 0 
      factors_array << x 
    end 

    prime_array = factors_array 
    puts "#{prime_array} before" 
    factors_array.each do |i| #gets prime factors from factors 
     for p in 2...i #checks if numbers are prime numbers 
      if i % p == 0 
       test_array << i 
       not_prime = i 
       prime_array.delete(not_prime) 
      end 
     end   
    end 
    puts "#{test_array} test array" 
    puts "largest prime factor is = #{prime_array.max}" 
end 
make_array(600851475143) 
# answer is 104441, but it should be 6857 
+0

각 루프 내의'Array'를 수정하는 것은 권장하지 않습니다.'prime_array'는 단순히 여러분이하고있는 것과 정확히 일치하는'factors_array'에 대한 참조 일 뿐이므로 실제 일어나고있는 것은 루프 중에 일부 숫자를 건너 뛰는 것입니다 . 내 문장을 시각화하려면 루프 뒤에'factors_array'와'prime_array'를보십시오 (힌트 : 그것들은 동일합니다). 어쩌면'prime_array = factors_array.dup'을 시도하십시오 – engineersmnky

답변

2

문제가이 라인에 의해 발생되는이 광고 후

prime_array = factors_array 

, 모두 prime_arrayfactors_array 및 변수 참조 (지점) 같은 객체 Array. prime_array.delete(not_prime) 행이 실행되면 factors_array.each 반복은 요소를 건너 뜁니다 (다음 요소가 섞여 있기 때문입니다).

당신은 dup 방법으로 배열을 복제하여 문제를 해결할 수 :

prime_array = factors_array.dup 

이 당신에게 처음에 같은 항목이 포함 된 두 개의 독립적 인 Array 객체를 참조 prime_arrayfactors_array 변수를 제공 할 것입니다. prime_arrayArray을 수정해도 factors_arrayArray 이상의 반복에는 영향을주지 않습니다.

+0

확실한 신용을 얻으십시오 :) – engineersmnky

+0

@engineersmnky 제 답변을 게시 한 후에 만 ​​귀하의 의견을 보았습니다. 댓글 대신 답을 작성했다면 알림을 보았고 취소되었을 것입니다 (그리고 나서 크레딧을받을 수있었습니다). –

+0

감사합니다. 그게 완벽하게 작동했고, 나는 뭔가를 배웠습니다. – Meeses