6

为了自娱自乐,我决定尝试编写一个批处理文件来计算冰雹序列。但是,我遇到了一些大数字的小问题。

首先,代码:

:START
@ECHO OFF
SETLOCAL
SET /P InputVar="Input Number: "
ECHO.
ECHO %InputVar%
SET ItCount=0

:COLLATZ
SET /A ItCount=%ItCount%+1
SET /A Odd=%InputVar%%%2
IF %Odd% EQU 1 (
    SET /A OutputNum=%InputVar%*3+1
) ELSE (
    SET /A OutputNum=%InputVar%/2
)
ECHO %OutputNum%
IF %OutputNum% LSS 1 (
    GOTO ERROR
) ELSE (
    GOTO RECYCLE
)

:ERROR
ECHO.
ECHO ERROR!
GOTO END

:RECYCLE
IF %OutputNum% EQU 1 (
    GOTO FINISH
) ELSE ( 
    SET InputVar=%OutputNum%
    GOTO COLLATZ
)

:FINISH
ECHO.
ECHO Completed in %ItCount% iterations.

:END
ENDLOCAL
PAUSE

这适用于我测试过的几个数字。然而,当我开始测试一个我需要数百次迭代才能完成的新数字时,系统开始返回输出。有趣的是,负输出最终归零。但是,脚本的这种行为根本不是预期的或预期的。

添加错误处理后,这是我得到的输出8388607

在此处输入图像描述

谷歌称,下一个数字应该是2176782334

这是命令处理器处理大量数字能力的自然限制吗?类似的操作在 Excel 中运行良好 - 在那里,我能够确定数字应该在 473 次迭代中解析为 1。

我正在运行 Windows 7 SP1 x64。

4

2 回答 2

6

2176782334 大于 32 位整数可以容纳的值。(2^31 - 1 = 2,147,483,647)。您遇到的是整数溢出(导致负值)。

大多数现代语言都有一种数据类型long,允许您保存 -2^64 到 2^64 -1 范围内的整数。甚至还有数据类型允许无限精度整数,例如 Java 的BigInteger.

于 2012-07-18T16:30:18.853 回答
2

批处理文件中可能的最大整数很可能是 2,147,483,647(32 位有符号整数的最大值)。

于 2012-07-18T16:29:15.577 回答