【发布时间】:2023-03-05 00:19:01
【问题描述】:
最近我一直在处理一些简单的项目 Euler 问题并用 Ruby 和 C++ 解决它们。但是对于关于 Collatz 猜想的Problem 14,我的 C++ 代码运行了大约半个小时才终止它,但是当我将代码翻译成 Ruby 时,它在 9 秒内就解决了。
这种差异让我难以置信 - 我一直被认为 C++ 几乎总是比 Ruby 快,尤其是在数学处理方面。
我的代码如下。
C++:
#include <iostream>
using namespace std;
int main ()
{
int a = 2;
int b = 2;
int c = 0;
while (b < 1000000)
{
a = b;
int d = 2;
while (a != 4)
{
if (a % 2 == 0)
a /= 2;
else
a = 3*a + 1;
d++;
}
if (d > c)
{
cout << b << ' ' << d << endl;
c=d;
}
b++;
}
cout << c;
return 0;
}
运行时间 - 老实说,我不知道,但这真的很长。
和鲁比:
#!/usr/bin/ruby -w
a = 0
b = 2
c = 0
while b < 1000000
a = b;
d = 2
while a != 4
if a % 2 == 0
a /= 2
else
a = 3*a + 1
end
d+=1
end
if d > c
p b,d
c=d
end
b+=1
end
p c
运行时间 - 大约 9 秒。
知道这里发生了什么吗?
附:在达到 100,000 之前,C++ 代码的运行速度比 Ruby 代码快很多。
【问题讨论】:
-
将
endl更改为"\n",因为它执行流的刷新并且无缓冲的 IO 真的很慢。 -
如何编译 C++?
-
可以,但是当它达到更高的数字时,打印之间的间隔可能长达几分钟,并且 endl 和 "\n" 的差异可以忽略不计
-
我喜欢这个问题,因为假设不存在。展示了很多关于假设的内容!
-
这段代码不等价,你甚至没有发布你的编译器设置。