Euler#3 in ruby​​。我对红宝石有什么不了解?

时间:2015-07-10 07:10:00

标签: ruby primes sieve-of-eratosthenes

Project Euler 3

  

13195的主要因素是5,7,13和29。

     

600851475143号码的最大主要因素是什么?

我不想只是谷歌解决这个问题的解决方案,因为我想要了解这种语言..基本上,我现在拥有的,如果我运行它,我的终端停止响应。没有错误消息或任何东西。我猜这是一个无限循环?

我试图找到1000以下的主要因素。我已经抬起了eratosthenes的筛子,不知道我将如何写出其中的一个......提前感谢任何和所有的帮助。

$factors = []
$i = 1

def factor(n)
    $i += 1
    while $i < n do
        $factors << $i if ($i < 1000 && n % $i == 0)
    end
end

factor(600851475143)

puts $factors

3 个答案:

答案 0 :(得分:2)

您有一个循环,直到$in之间的关系以某种定义的方式发生变化。鉴于$in都没有从循环内的初始值开始计算,这将有点困难。

由于您距离解决方案相当远,我不知道如何在不实际为您编写的情况下告诉您如何编写它。我能做的最好的事情就是建议查看the pseudocode并尝试逐字转录成Ruby。

我想要注意的另一件事是你对全局变量的依赖。它们几乎从不在Ruby中使用,因为它们表示代码的结构问题。他们几乎总是一个坏主意。虽然不使用类,但只使用普通变量(ifactors ...)而不是全局变量($i$factors ...)。

答案 1 :(得分:2)

好吧,因为$i += 1在循环之外,它永远不会完成。

我建议你不要使用全局变量,尽管它现在可能不是你的重点。

答案 2 :(得分:0)

据我所知,我相信你的终端没有响应的问题是因为你从2循环到如此高的数字。当你调用因子(600851475143)时,你的n是600851475143所以你基本上运行的代码就像

counter = 0
counter += 1 while counter < 600851475143

如果您运行上面的代码,它会产生您描述的相同错误

您还可以注意到计算机完成上面的while循环所需的时间随着您增加数量而变得更长,因为您可以通过一次取消注释一个循环来查找

counter = 0
counter += 1 while counter < 100851475143 #Still gives blank screen
#counter += 1 while counter < 851475143 #Much smaller but still produces the error
#counter += 1 while counter < 51475143 #No error, but does not finish immediately
#counter += 1 while counter < 1475143 #Finished almost immediately

对于您描述的问题,我建议编写辅助函数来计算数字的第一个数字

def first_multiple(number)
  return number if number <= 2
  multiple = 2
  multiple += 1 while number%multiple != 0
  multiple
end

如果传入的数字等于输出,此函数还会告诉数字是否为素数。使用上面的函数,您可以创建一个数字,其数字除以first_multiple和第一个数字,因此10将是[2,5]。然后,如果数字不等于倍数,则可以循环遍历此数组并通过将每个数字除以其第一个数字来创建新数组。继续执行此步骤,直到数组的所有元素等于其第一个多重

查看Array.any等数组类的一些方法也会有所帮助?如果数组的任何元素满足块

,则返回true