我正在解决一个问题,虽然我已经解决了(经过很长一段时间),我想找出我的实现出了什么问题。我在Windows上用c++和Python编写了我的解决方案。我试着用codeskulptor为我的Python工作,它给了我一些TIMELIMITERROR。我切换到c++语言,它给了我一些奇怪的错误。我启动了我的虚拟机,以便我试图找出为什么我的c++代码失败了(我使用了Borland的BCC32)。我可以检测到Collatz序列生成的长int数,这会使我的程序崩溃。在Linux下,我得到了几乎相同的错误,尽管我可以看到在Linux下,程序可以运行并且可以很好地处理长数字(使用g++编译器)。在Linux下工作,我可以使用我为windows开发的相同的Python程序,它工作起来很简单。我想知道为什么c++在Windows和Linux上都失败了。
in Python:
def Collatz(num):
temp = []
temp.append(num)
while num> 1:
num = num%2==0 and num/2 or num*3+1
temp.append(num)
return temp
in C++:
vector<unsigned long> collatz(int num)
{
vector<unsigned long> intList;
intList.push_back(num);
while(num>1)
{
if (num%2==0) num /=2;
else num=num*3+1;
intList.push_back(num);
}
return intList;
}
这两段代码只是函数:
奇怪的是,这两个代码都可以很好地计算13或999999的序列。但是,例如c++无法计算837799的序列…也许这与矢量容器大小有关??
因为您的num
是int
,并且您在837799的Collatz系列中的元素991661525
之后获得溢出(所有操作都是用int
完成的,因此在num=num*3+1
中乘以991661525*3+1
时会溢出;)。将函数定义中的num
更改为unsigned long
vector<unsigned long> collatz(unsigned long num)
,它会工作!