2011-05-10 28 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