未知的批处理脚本错误

时间:2015-10-27 14:27:34

标签: batch-file

我不确定发生了什么,因为当我尝试运行它时,批处理脚本几乎完全关闭了。它非常简单,它应该测试一个数字(num)是否为素数。如果不是,则在num1大于num之前一直持续。

echo off
title Prime Numbers
cls
set /a prime=7
set /a num1=2
set /a num2=2
:do1
if %prime% == %num1% * %num2% goto do_if_1
if else %prime% LSS %num1% * %num2% set /a num2=%num2%+1
if else %prime% GTR %num1% * %num2% goto do_if_2
if else %prime% LSS %num1% * 1 goto do_if_3
goto do1
:do_if_1
set /a prime=%prime%+1
set /a num1=2
set /a num2=2
goto do1
:do_if_2
set /a num1=%num1%+1
set /a num2=2
goto do2
:do_if_3
echo %prime%
goto do_if_1

2 个答案:

答案 0 :(得分:2)

编辑:6n±1方法

如果它对任何人都有用,这里有一个更有效的方法来测试数字是素数还是复数。它是several people on this post提到的 6n±1 算法的批处理语言改编。

@echo off & setlocal enabledelayedexpansion

if "%~1"=="" goto usage
for /f "delims=0123456789" %%I in ("%~1") do goto usage

if %~1 LEQ 1 (
    echo %~1 is neither prime nor composite.
    exit /b 1
) else if %~1 LEQ 3 (
    echo %~1 is prime.
    exit /b 0
)

set /a "mod2or3 = ^!(%~1 %% 2) | ^!(%~1 %% 3), half = %~1 / 2"
if %mod2or3% EQU 1 (
    echo %~1 is composite.
    exit /b 1
)

for /L %%I in (5,6,%half%) do (
    set /a "n6pm1 = ^!(%~1 %% %%I) | ^!(%~1 %% (%%I + 2))"
    if !n6pm1! EQU 1 (
        echo %~1 is composite.
        exit /b 1
    )
)

echo %~1 is prime.
goto :EOF

:usage
echo Usage: %~nx0 integer
goto :EOF

原始答案:

我想我可能接受挑战。

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" goto usage
for /f "delims=0123456789" %%I in ("%~1") do goto usage

set /a limit = %~1 - 1

for /L %%I in (2,1,%limit%) do (
    set /a modulo = %~1 %% %%I
    if !modulo! equ 0 (
        echo %~1 is composite ^(divisible by %%I^).
        goto :EOF
    )
)

echo %~1 is prime.
goto :EOF

:usage
echo Usage: %~nx0 integer

你根据多米尼克的回答评论说:“我该如何解决这个问题呢?”获取脚本的第一部分:

set /a prime=7
set /a num1=2
set /a num2=2
:do1
if %prime% == %num1% * %num2% goto do_if_1

由于Squashman和我都告诉您if %prime% == %num1% * %num2%无法按预期工作,您现在应该知道需要在{{1}之上插入额外的set /a }}语句来执行if

%num1% * %num2%

让我们继续......

set /a prime=7
set /a num1=2
set /a num2=2
:do1
set /a product = num1 * num2
if %prime% == %product% goto do_if_1

这里有两个直接的问题。 #1,我想你可能意味着... if %prime% == %product% goto do_if_1 if else %prime% LSS %num1% * %num2% set /a num2=%num2%+1 ,而不是else if。 #2,在批处理脚本中,if else需要作为else命令的一部分包含在内if。这意味着else需要附加到上一行的末尾,或者您应该使用一些括号。像这样改写:

else

答案 1 :(得分:1)

我建议你的第一件事就是摆脱echo off,就像这样你可以按照你的剧本所做的那样:

D:\>set /a prime=7
D:\>set /a num1=2
D:\>set /a num2=2
D:\>if 7 == 2 * 2 goto do_if_1
7 was unexpected at this time. => this is causing your problem!
D:\>if else 7 LSS 2 * 2 set /a num2=2+1
D:\>