:: gcd.bat
@echo off
setlocal
set n=0
echo %1%2|findstr /r "[^0-9]" >NUL 2>&1
if %ERRORLEVEL% equ 0 (echo %~n0 [NUMBER] [NUMBER]) & goto :EOF
call :gcd %1 %2 n
endlocal & echo %n%
goto :EOF
:gcd
setlocal enabledelayedexpansion
set a=%1
set b=%2
set m=0
set q=0
if %a% lss %b% (
set /a a=%b%-%a%
set /a b-=!a!
set /a a+=!b!
)
:loop_gcd
call :mod %a% %b% m
if %m% equ 0 (endlocal & set %3=%b%) & goto :EOF
:: 剰余を除数の半分未満にして演算効率を向上
call :div %b% 2 q
if %q% lss %m% set /a m=%b%-%m%
set a=%b%
set b=%m%
goto loop_gcd
endlocal
goto :EOF
:mod
setlocal
set m=0
set q=0
call :div %1 %2 q
set /a m=%2*%q%
endlocal & set /a %3=%1-%m%
goto :EOF
:div
setlocal enabledelayedexpansion
set i=0
set m=%1
set m_=0
set n=%2
set n_=0
set q=0
if %n% gtr %m% (endlocal & set %3=%q%) & goto :EOF
call :msb %m% m_
call :msb %n% n_
set /a i=%m_%-%n_%
:loop_div
if %i% lss 0 (endlocal & set %3=%q%) & goto :EOF
set /a "q<<=1"
set /a "m_=%m%>>%i%"
if %m_% geq %n% (
set /a "n_=%n%<<%i%"
set /a m-=!n_!
set /a q+=1
)
set /a i-=1
goto loop_div
endlocal
goto :EOF
:: 最上位ビットを取得(most significant bit)
:msb
setlocal
set i=%1
set n=0
:loop_msb
set /a "i>>=1"
set /a n+=1
if %i% neq 0 goto loop_msb
endlocal & set %2=%n%
goto :EOF
silverwire
#5899()
[
Batchfile
]
Rating0/0=0.00
バッチは多倍長演算をサポートしていないため、図らずも #4841の「条件(易)」を選択。 除算・余剰については、「除算・余剰を使わずに閏年」で回答したものを流用しました。 e.g. C:>gcd.bat 1975 1225 25 遅延環境変数展開を利用しているので、Windows NTでは動作しません。Windows XPで動作 を確認。:: gcd.bat @echo off setlocal set n=0 echo %1%2|findstr /r "[^0-9]" >NUL 2>&1 if %ERRORLEVEL% equ 0 (echo %~n0 [NUMBER] [NUMBER]) & goto :EOF call :gcd %1 %2 n endlocal & echo %n% goto :EOF :gcd setlocal enabledelayedexpansion set a=%1 set b=%2 set m=0 set q=0 if %a% lss %b% ( set /a a=%b%-%a% set /a b-=!a! set /a a+=!b! ) :loop_gcd call :mod %a% %b% m if %m% equ 0 (endlocal & set %3=%b%) & goto :EOF :: 剰余を除数の半分未満にして演算効率を向上 call :div %b% 2 q if %q% lss %m% set /a m=%b%-%m% set a=%b% set b=%m% goto loop_gcd endlocal goto :EOF :mod setlocal set m=0 set q=0 call :div %1 %2 q set /a m=%2*%q% endlocal & set /a %3=%1-%m% goto :EOF :div setlocal enabledelayedexpansion set i=0 set m=%1 set m_=0 set n=%2 set n_=0 set q=0 if %n% gtr %m% (endlocal & set %3=%q%) & goto :EOF call :msb %m% m_ call :msb %n% n_ set /a i=%m_%-%n_% :loop_div if %i% lss 0 (endlocal & set %3=%q%) & goto :EOF set /a "q<<=1" set /a "m_=%m%>>%i%" if %m_% geq %n% ( set /a "n_=%n%<<%i%" set /a m-=!n_! set /a q+=1 ) set /a i-=1 goto loop_div endlocal goto :EOF :: 最上位ビットを取得(most significant bit) :msb setlocal set i=%1 set n=0 :loop_msb set /a "i>>=1" set /a n+=1 if %i% neq 0 goto loop_msb endlocal & set %2=%n% goto :EOFRating0/0=0.00-0+
[ reply ]