Простой факторинг возвращает ноль при подаче простых чисел

Я сделал метод, который генерирует простые факторы. Какое бы составное число я ему ни подсовывал, оно дает простые множители. Однако, если я вставлю в него простое число, оно не вернет 1 и само число. Вместо этого он вернет 1 и некоторое простое число, меньшее, чем число, введенное в метод.

Я решил добавить оператор if, который прервет процесс, если введенное число окажется простым. Вот код:

def get_prime_factors(number)
  prime_factors = []
  i = 0
  primes = primes_gen(number)
  if primes.include?(number)
    return "Already a prime!"
  end
  original_number = number
  while primes[i] <= original_number / 2
    if number % primes[i] == 0
      prime_factors << primes[i]
      number = number / primes[i]
    else
      i = i + 1
    end
    if number == 1
      return prime_factors
    end
  end
end

Я передал методу 101, и метод вернул nil. Этот метод вызывает метод primes_gen, который возвращает массив, содержащий все простые числа, меньшие входного значения. Вот:

def primes_gen(limit)
  primes = []
  i = 0
  while i <= limit
    primes << i if isprime?(i)
    i = i + 1
  end
  primes.delete(0)
  primes.delete(1)
  return primes
end

Я знаю, что должен быть более тонкий способ исправить ошибку. Если кто-то хочет порекомендовать мне направление для изучения, насколько это возможно, я был бы очень благодарен.

РЕДАКТИРОВАТЬ: Изменена строка 4 метода primes_gen(), чтобы включить оператор ‹= вместо оператора ‹.


person Michael Nail    schedule 19.10.2013    source источник
comment
Попробуйте изменить primes = primes_gen(number) на primes = primes_gen(number+1) в первой функции и посмотрите, работает ли она. Или попробуйте изменить условие i < limit на i <= limit во второй функции.   -  person Anshul Goyal    schedule 19.10.2013
comment
Кроме того, почему вы удаляете 0-й и 1-й элементы в методе primes_gen? Это из-за значений, которые вы получаете для 0, 1? В этом случае вы можете инициализировать с помощью i=2.   -  person Anshul Goyal    schedule 19.10.2013
comment
Огромное спасибо! Изменение i ‹ limit на i ‹= limit помогло. :) Мне нужно быть более осторожным с этими операторами!   -  person Michael Nail    schedule 19.10.2013
comment
Да, конечно! Просто сделал. :) Спасибо еще раз.   -  person Michael Nail    schedule 19.10.2013


Ответы (1)


Попробуйте изменить primes = primes_gen(number) на primes = primes_gen(number+1) в первой функции и посмотрите, работает ли она. Или попробуйте изменить условие i < limit на i <= limit во второй функции.

Кроме того, почему вы удаляете 0-й и 1-й элементы в primes_gen method? Это из-за значений, которые вы получаете для 0, 1? В этом случае вы можете инициализировать с помощью i=2.

person Anshul Goyal    schedule 19.10.2013