2016-03-02 75 views
0

我正在嘗試在批處理中編寫一個程序,將數字放入簡化的激進形式。有沒有辦法檢查一個數字是否是一個完美的正方形?是否有BATCH/CMD命令檢查數字是否是完美的正方形?

+0

停止寫作批次,有很大的選擇 – Marged

+1

翻譯:「我不知道如何在批量解決這個問題,所以你需要學習不同的語言。」 - [Marged](http://stackoverflow.com/users/1354537/marged) – rojo

+0

@rojo:優秀的評論! **'+ oo' ** – Aacini

回答

2

最簡單的方法是用與接受打印張數是或否取決於如果數量爲方形或不併設置1 ERRORLEVEL如果它是一個子程序嵌入的JScript code.Here的例子:

@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 

現在我想的是純粹的單批溶液(可檢查所有34bit平方數列表?)

+1

擊敗純粹的批次解決方案。 ':)' – rojo

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函數會設置錯誤級別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% 
+1

非常好:) ... – npocmaka

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%