2016-11-05 182 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 
)