我是新来的Ruby,并认为这将是学会解决在项目欧拉的问题更多的好方法。了解Ruby的逻辑运算符
这就是我想出了使用暴力的问题5:
#What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
end_point = 1_000_000_000
start_point = 2_520
(start_point..end_point).each do |number|
flag = true
(2..20).each do |divisor|
flag = flag & (number % divisor) == 0 ? true : false
end
print number.to_s + "\n" if flag
end
它运行很长一段时间,并没有给出答案。
然后我用同样的逻辑来写C++程序做同样的任务:
#include<iostream>
using namespace std;
int main()
{
unsigned long int solution = 2520;
while(1)
{
bool flag = true;
for(int divisor=2;divisor<=20;divisor++)
{
if(solution % divisor == 0)
flag = flag & true;
else{
flag = false;
break;
}
}
if(flag == true){
cout<<solution<<endl;
break;
}
solution++;
}
return 0;
}
这一次给了我正确的解决方案并运行几乎没有第二个。执行时间并不关心我,因为Ruby被解释和C++编译,但Ruby在返回正确答案方面的失败让我感到惊讶。我认为这可能是因为我试图编写C++ Ruby风格,而不是实际的Ruby方式。
我在这里做错了什么?
您的替代解决方案正是我正在寻找, 人们如何编写比我能够在红宝石上更美丽的代码,这不是太好了吗?我想知道我该如何真正学习这种红宝石方式。 – nikhil 2011-06-14 09:27:18
你能告诉我&&和'和'之间的区别吗?最初我使用'和',因为这不起作用,我试过&。 – nikhil 2011-06-14 09:31:38
不客气。我认为这里的相关思想是Ruby喜欢直接用集合来做事情;也就是说,在Enumerable上调用隐式循环方法比在显式循环内容上更鲁莽。顺便说一下,这两种方法都给出了正确的答案,但我的速度更快(因为任何一种方法一旦失败就会短路)。 – Chowlett 2011-06-14 09:32:58