我正在解决一个问题,虽然我已经解决了(很长一段时间后)我想知道我的实现有什么问题。 我在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的序列...也许它与向量容器大小有关??答案 0 :(得分:1)
由于您的num
是int
,并且您在837799的Collatz系列中的元素991661525
之后出现溢出(所有操作均使用int
完成,因此,当您在991661525*3+1
;)中乘以num=num*3+1
时,您会溢出。在函数定义
num
更改为unsigned long
vector<unsigned long> collatz(unsigned long num)
它会起作用!