Collatz C++ 代码的问题
Posted
技术标签:
【中文标题】Collatz C++ 代码的问题【英文标题】:Problems with Collatz C++ code 【发布时间】:2014-05-24 20:23:24 【问题描述】:我正在解决一个问题,虽然我已经解决了(很久之后)我想找出我的实现出了什么问题。 我在 Windows 中使用 C++ 和 Python 编写了我的解决方案。我正在尝试为我的 Python 使用 codeskulptor,它给了我一些 TIMELIMITERROR。我切换到 C++ 语言,它给了我一些奇怪的错误。我启动了我的虚拟机,试图找出我的 C++ 代码失败的原因(我使用了 Borland 的 BCC32)。我可以检测到由 Collatz 序列生成的 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】:因为您的num
是int
,并且您在Collatz 系列中为837799 的元素991661525
之后出现溢出(所有操作均使用int
完成,因此在乘以991661525*3+1
时会溢出在num=num*3+1
;)。在函数定义中将num
改为unsigned long
vector<unsigned long> collatz(unsigned long num)
它会起作用的!
【讨论】:
是的!不检查那个真是个傻瓜......我改变了向量声明并没有检查 num 变量......谢谢家伙以上是关于Collatz C++ 代码的问题的主要内容,如果未能解决你的问题,请参考以下文章
Collatz Conjecture Python - 超过 2 万亿的错误输出(仅限!)