Ruby on rails Project Euler#3 Ruby解决方案-我的代码有什么问题?

Ruby on rails Project Euler#3 Ruby解决方案-我的代码有什么问题?,ruby-on-rails,ruby,primes,factorization,Ruby On Rails,Ruby,Primes,Factorization,这是我的代码: def is_prime(i) j = 2 while j < i do if i % j == 0 return false end j += 1 end true end i = (600851475143 / 2) while i >= 0 do if (600851475143 % i == 0) && (is_prime(i) ==

这是我的代码:

def is_prime(i)
    j = 2
    while j < i do 
        if i % j == 0
            return false
        end
        j += 1
    end
true
end

i = (600851475143 / 2)
while i >= 0 do 
    if (600851475143 % i == 0) && (is_prime(i) == true) 
        largest_prime = i
        break 
    end
    i -= 1
end



puts largest_prime
def为素数(i)
j=2
而我是
如果i%j==0
返回错误
终止
j+=1
终止
符合事实的
终止
i=(600851475143/2)
而我>=0做
if(600851475143%i==0)&(is_prime(i)==true)
最大素数=i
打破
终止
i-=1
终止
放置最大的_素数
为什么它不归还任何东西?对所有的数字进行计算是不是太大了?有没有一种不使用Ruby prime库的简单方法来实现这一点(违背了目的)


我在网上找到的所有解决方案对我来说都太高级了,有没有初学者能够理解的解决方案?

我不想回答太多问题,而是想问你如何才能找到答案

最优雅的故障排除方法是使用调试器了解实际发生的情况:

也就是说,我很少使用调试器——我只是在这里和那里插入puts来查看发生了什么

从添加
开始,将“testing#{i}”
作为循环中的第一行。虽然屏幕I/O的速度比静默计算慢一百万倍,但它至少会让您确信它正在做您认为它正在做的事情,并且可能会让您了解整个问题需要多长时间。或者,它可能会揭示一个错误,例如计数器没有改变,以错误的方向递增,超出中断条件,等等。基本的健全性检查

如果这并没有引起一个灯泡,那么深入一点,
放入If语句中。还没有披露?接下来放入的是_prime(),然后放入的是_prime()的循环。你明白了

此外,在开发过程中,世界上没有理由从600851475143开始!17、51、100和1024也同样有效。(别忘了边缘情况,比如0、1、2、-1等等,只是为了好玩。)这些都将在你的手指离开回车键之前完成——或者证明你的算法真的永远不会返回并将你送回绘图板

使用这两种方法,我相信你会在一两分钟内找到答案。祝你好运

“过早优化是(所有问题的根源)。”

在这里,你可以马上得到(1)最大,(2)素数,因子。找出所有的因素,不管是否为素数,然后取最后一个(最大的)素数。当我们解决这个问题时,我们可以开始优化它


一个数
n
的系数
A
存在一些
b
(我们假设
A你知道你可以用Ruby中的一行代码来解决这个问题吗

Prime.prime_division(600851475143).flatten.max

=> 6857

因为它循环了大量的数字。它需要时间才能完成。
Project Euler
的目的是提出有效的算法。查找埃拉托斯特尼筛,或任何其他素筛。另一个问题是Ruby对
prime
的实现很慢。除此之外,是的,重点是学习与暴力求解相反的算法。或者只是…600851475143是问题中的实际数字。一般来说,这不是关于因式分解,而是针对这个特定数字。我相信,所使用的算法适用于1024。我建议继续测试较小的数,如1024,以验证和完善算法。如果解决你需要解决的问题需要一个小时、一天或一个月的时间,解决一个小问题需要一秒钟的时间。如果你能通过多次迭代测试和优化将这个问题降到0.5、0.1、0.001秒,那么你真正需要解决的问题可能只需要一秒钟或一分钟使用分析器(ruby prof,GC:profiler,等等),这样您就可以真正看到CPU在哪里,以及您的更改会产生什么影响。对于运行时预测,我通常使用方法论。