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

Posted

技术标签:

【中文标题】Collat​​z C++ 代码的问题【英文标题】:Problems with Collatz C++ code 【发布时间】:2014-05-24 20:23:24 【问题描述】:

我正在解决一个问题,虽然我已经解决了(很久之后)我想找出我的实现出了什么问题。 我在 Windows 中使用 C++ 和 Python 编写了我的解决方案。我正在尝试为我的 Python 使用 codeskulptor,它给了我一些 TIMELIMITERROR。我切换到 C++ 语言,它给了我一些奇怪的错误。我启动了我的虚拟机,试图找出我的 C++ 代码失败的原因(我使用了 Borland 的 BCC32)。我可以检测到由 Collat​​z 序列生成的 long 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】:

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

vector<unsigned long> collatz(unsigned long num)

它会起作用的!

【讨论】:

是的!不检查那个真是个傻瓜......我改变了向量声明并没有检查 num 变量......谢谢家伙

以上是关于Collat​​z C++ 代码的问题的主要内容,如果未能解决你的问题,请参考以下文章

Erlang中的Collat​​z序列

Collat​​z Conjecture Python - 超过 2 万亿的错误输出(仅限!)

python Collat​​z序列

python 最长的Collat​​z序列(Euler#14)

c_cpp 使用libgmp进行Collat​​z。

简单的多线程帮助? C++、WaitForSingleObject 和同步