2016-11-05 164 views
4

我想批量编码collat​​z猜想测试(这是数学的东西)。文件的要点是要测试一个数字是否是偶数,以及它是否除以二。如果数字是奇数,则应该乘以3并加1。这应该一遍又一遍地循环。每次我尝试运行这个文件时,它都允许我输入数字,然后它说'+此时是意外的。这里有什么错误?批+'意外'错误

@echo off 
color f0 
title Collatz Conjecture Tester 
echo/ 
echo Enter the number you want to test. 
echo/ 
echo/ 
set /p number= 
:start 
set /a test=%number% %% 2 
if %test% EQU 0 ( 
    set /a number=%number% * 1/2 
) else (
    set /a number=(%number% * 3) + 1 
) 
echo/ 
echo Result: %number% 
timeout /t 1 >nul 
goto start 
+1

值得一提的是,在批次中的所有数字签名的32位整数,所以您的代码将接受最大输入为2147483647,甚至你的代码的'3N + 1'部分意味着将有一个整数溢出结果会变成负面的。 – SomethingDark

回答

2

SomethingDark已经发现该问题的根本原因,并显示在their answer妥善的解决办法。

的另一种方法,以避免与括号麻烦,也有一些运营商如&|^<<>>等是一对引号中的包围set /A整个表达式:

if %test% EQU 0 ( 
    set /A "number=%number% * 1/2" 
) else (
    set /A "number=(%number% * 3) + 1" 
) 

如果你这样做,你不必再考虑正确的转义。

注意,%运营商总是需要转义像在批处理文件%%
case delayed expansion被启用时,操作者!需要转义像^!的情况下的表达置于内"",并且通过^^!否则。

3

当你拥有的if陈述,for循环,或其他代码块括号内,重要的是你逃避任何其他内部封闭的括号以使得一批解释知道你还没有完成是非常重要的。

眼下,一批在读你的if声明是这样的:

else (
    set /a number=(%number% * 3 
) 
+ 1 

所以它认为你早终止else,并在那里扔+ 1出于某种原因。为了解决这个问题,你可以用^来避开内部的右括号。

if %test% EQU 0 ( 
    set /a number=%number% * 1/2 
) else (
    set /a number=(%number% * 3^) + 1 
)