#ruby #primes #irb #computation
#ruby #простые числа #irb #вычисление
Вопрос:
У меня начались некоторые проблемы с Project Euler. Один из вопросов:
Простые множители 13195 равны 5, 7, 13 и 29. Какой наибольший простой множитель числа 600851475143?
У меня есть некоторый написанный код … и он работает:
class Integer
def primeFactors
load('/home/arseno/ruby/lib/prime.rb')
a = []
for i in (1..self)
div = self.to_f/i.to_f
if((div==div.to_i)amp;amp;(Prime.prime?(i)))
a << i
end
end
a
end
end
puts 13195.primeFactors
Выводит:
5
7
13
29
Пока все хорошо! Теперь, когда я вместо этого ввожу 600851475143, мой терминал зависает (это справедливо, он вычисляет целую кучу вещей!) Итак, что я попытался сделать, так это поместить puts i
в цикл / if, чтобы я фиксировал вывод по мере его повторения through…in в режиме реального времени.
Но, помещая это puts i
в цикл, Ruby не выводит переменную на протяжении всей итерации; вместо этого он сохраняет значения в каком-то буфере и удаляет их, когда вычисление завершено.
Для вычисления этой конкретной проблемы Ruby требуется вечность (она выполняется в течение 10 минут), я подозреваю, что это связано с преобразованиями с плавающей запятой.
Почему Ruby (мой терминал?) сохранение значений до конца вычисления? Могу ли я видеть значения в режиме реального времени, когда он их находит? У вас есть лучший способ сделать это?
Ответ №1:
Попробуйте добавить STDOUT.sync = true
. Вы также могли бы попробовать STDOUT.flush
после puts
. Еще немного информации здесь.
Комментарии:
1. На самом деле это не удивительно, это стандартная часть многих языков. В Perl это было бы глобальным
$|
. Для повышения скорости ввод-вывод буферизуется, будь то на диск или на экран. Такая буферизация может вызвать проблемы с частичной записью, поэтому часто мы отключаем ее, чтобы как можно быстрее доставить данные на диск или по назначению.