Collat​​z C ++代码的问题

时间:2014-05-24 20:23:24

标签: python c++ linux

我正在解决一个问题,虽然我已经解决了(很长一段时间后)我想知道我的实现有什么问题。 我在Windows中用C ++和Python编写了我的解决方案。我正在尝试使用codeskulptor为我的Python,它给了我一些TIMELIMITERROR。我切换到C ++语言,它给了我一些奇怪的错误。我启动了我的虚拟机,以便我试图找出我的C ++代码失败的原因(我使用了Borland的BCC32)。我可以检测到Collat​​z序列生成的长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的序列...也许它与向量容器大小有关??

1 个答案:

答案 0 :(得分:1)

由于您的numint,并且您在837799的Collat​​z系列中的元素991661525之后出现溢出(所有操作均使用int完成,因此,当您在991661525*3+1;)中乘以num=num*3+1时,您会溢出。在函数定义

中将num更改为unsigned long
vector<unsigned long> collatz(unsigned long num)

它会起作用!