我正在尝试在批处理中编写一个程序,将数字转换为简化的激进形式。有没有办法检查一个数字是否是一个完美的正方形?
问问题
254 次
3 回答
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 宏慢。
这是一个基于Wikipedia上的算法的纯批处理解决方案。(有关详细信息,请参阅标有“二进制数字系统(以 2 为底)”的部分。):sqrt
如果数字是完全平方,则该函数设置错误级别 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%
于 2016-03-03T00:38:59.103 回答
2
如果给定的数字不是一个,下面出现的纯批处理文件解决方案也会得到最接近的完美平方。
@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%
于 2016-03-03T07:15:24.700 回答
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 位平方数的列表?)
于 2016-03-02T21:22:15.933 回答