是否有BATCH / CMD命令检查数字是否是完美的正方形?

时间:2016-03-02 20:01:43

标签: batch-file cmd perfect-square

我试图在Batch中编写一个程序,将数字放入简化的激进形式。有没有办法检查一个数字是否是一个完美的正方形?

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用嵌入式jscript代码。这个例子中有一个接受数字的子程序打印是或否取决于数字是否为正方形,如果是,则将errorlevel设置为1:

@echo off

call :isSquare 81
call :isSquare 7
call :isSquare 9

if errorlevel 1 (
    echo 9 is a square number
)
exit /b %errorlevel%


:isSquare
setlocal
set /a number=%~1

:: Define simple macros to support JavaScript within batch
set "beginJS=mshta "javascript:code(close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write("
set "endJS=)));""



:: FOR /F does not need pipe
for /f %%N in (
  '%beginJS% Math.sqrt(%number%) %endJS%'
) do set sqrt=%%N

if "%sqrt%" equ "%sqrt:.=%" (
    echo Yep!
    endlocal & exit /b 1

) else (
    echo Nope!
    endlocal & exit /b 0
)

endlocal

现在我正在考虑纯批量解决方案(可能正在检查所有34位平方数的列表?)

答案 1 :(得分:2)

最简单的方式是使用PowerShell命令。

@echo off
setlocal

call :isSquare 25 && (
    echo The square root is an integer.
) || (
    echo The square root is a float.
)

goto :EOF

:isSquare <num>
for /f "tokens=2 delims=." %%I in ('powershell "[math]::Sqrt(%1)"') do exit /b 1
exit /b 0

它比npocmaka的JScript宏慢。

这是基于algorithm found on Wikipedia的纯批处理解决方案。 (有关详细信息,请参阅标记为“二进制数字系统(基数2)”的部分。)如果数字是完美的正方形,:sqrt函数设置errorlevel 0,否则设置为非零;并为结果设置变量。这很快。

@echo off
setlocal

set num=2147395600

call :sqrt %num% foo && (
    call echo The square root of %num% is %%foo%%
) || (
    echo %num% is not a perfect square
)

goto :EOF

:sqrt <num> <return_var>
setlocal enabledelayedexpansion
set /a "res = 0, bit = 1 << 30, num = %~1"

:sqrt_loop1
if %bit% gtr %num% (
    set /a "bit >>= 2"
    goto :sqrt_loop1
)

:sqrt_loop2
if %bit% neq 0 (
    set /a resbit = res + bit
    if %num% geq !resbit! (
        set /a "num -= resbit, res >>= 1, res += bit"
    ) else set /a "res >>= 1"
    set /a "bit >>= 2"
    goto sqrt_loop2
)

set /a "ret = %~1 - (res * res)"
endlocal & set "%~2=%res%" & exit /b %ret%

答案 2 :(得分:2)

如果给定的数字不是一个,那么下面显示在this question的纯批处理文件解决方案也会获得最接近的完美正方形。

@echo off
setlocal

cls
set /P "N=Enter a number: "

set /A "x=N/(11*1024)+40, x=(N/x+x)>>1, x=(N/x+x)>>1, x=(N/x+x)>>1, x=(N/x+x)>>1, x=(N/x+x)>>1, x+=(N-x*x)>>31, M=x*x"

if %N% equ %M% (
   echo %N% is perfect square
   goto :EOF
)

set /A "I=(x+1)*(x+1), ID=I-N, MD=N-M"
if %ID% lss %MD% set M=%I%
echo The closest perfect square is %M%