2011-05-10 37 views
3

我在Project Euler上開始了一些問題。其中一個問題:Ruby不會實時輸出

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)&&(Prime.prime?(i))) 
     a << i 
     end 
    end 
    a 
    end 
end 

puts 13195.primeFactors 

輸出:

5 
7 
13 
29 

到目前爲止好!現在,當我輸入600851475143時,終端掛起(理所當然,它計算了很多東西!)所以我試圖做的是在循環/ if中放入puts i,以便將輸出捕獲爲它通過...實時地迭代。

但是通過將這個puts i放入循環中,Ruby在迭代過程中不會輸出變量;相反,它保存在某種緩衝區中的值,並在計算完成時將其刷新。

這個特殊的問題是Ruby永遠無法計算(它已經運行了10分鐘),我懷疑它是在浮點數轉換中。

爲什麼Ruby(我的終端?)保持值直到計算結束?我可以實時看到這些值嗎?你有更好的方式來做到這一點?

回答

11

嘗試添加一個STDOUT.sync = true。您也可以在puts之後嘗試STDOUT.flush。一些更多信息here

+0

太神奇了,謝謝! – 2011-05-10 03:53:26

+0

這不是太神奇,它是許多語言的標準部分。在Perl中,它將是全局的'$ |'。爲了提高速度,I/O被緩衝,無論是磁盤還是屏幕。緩衝可能會導致部分寫入問題,所以我們經常關閉它以便儘可能快地將數據存入磁盤或其目標。 – 2011-05-10 05:28:49