正整数のゲーデル数化?
Posted feedbacks - Batchfile
NT系のCMD.EXEでは、SET /Aで計算ができます。
このコード、goedel.batという名で保存してください。バッチファイルが体を張って関数goedelという形態になっているということにさせてください。さすがにバッチファイル内でサブルーチンは無理です……よね?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @ECHO OFF
If NOT "%1"=="/R" (
CALL %0 /R %1 2 3 5 7 11
GOTO EXIT
)
SET /A G = 1
SET /A T = %2
:NEXT
SET /A N = %T:~0,1% + 0
FOR /L %%I IN (1, 1, %N%) DO SET /A G *= %3
SET /A T = %T:~1% + 0
SHIFT
IF NOT "%T%"=="0" GOTO NEXT
ECHO %G%
:EXIT
|
> バッチファイル内でサブルーチンは無理です... よね?
setlocalとendlocalで変数のスコープを区切り、callと:EOFを組み
合わせればできます。
バッチなので限界はありますが、整数 nの桁数に応じて素数を生成
するようにしました。
素数を生成する部分もサブルーチンにしたかったのですが、戻り値
に複数の値(擬似的な配列)を返すことができなかったので、そこは
あきらめました。
e.g.
C:\>@echo off & (for %n in (9 81 230) do #100.bat %n) & echo on
512
768
108
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | @echo off
setlocal enabledelayedexpansion
set G=1
set i=0
set j=0
set k=1
set l=0
set n=%~1
set p=
set t=0
set v=0
set x=1
(echo %n%) | findstr /r [0-9] > NUL 2>&1 || (echo usage: %~n0 NUMBER >&2 & exit /b 1)
call :length %n% l
:: 素数を生成
set p[0]=2
:LOOP_1
if %k% geq %l% goto BREAK
set /a x+=2
set j=0
:LOOP_2
if %j% lss %k% (
set /a t=x%%!p[%j%]!
if !t! neq 0 (
set /a j+=1
goto LOOP_2
)
)
if %j% equ %k% (
set p[!k!]=%x%
set /a k+=1
)
goto LOOP_1
:BREAK
set /a l-=1
for /l %%i in (0,1,%l%) do (
call :power !p[%%i]! !n:~%%i,1! v
set /a G*=v
)
endlocal & echo %G%
goto :EOF
:length
setlocal enabledelayedexpansion
set i=0
set t=%~1
if not "%t%" == "" (
:_
set t=!t:~1!
set /a i+=1
if not "!t!" == "" goto _
)
endlocal & set %~2=%i%
goto :EOF
:power
setlocal
set n=1
for /l %%i in (1,1,%~2) do set /a n*=%~1
endlocal & set %~3=%n%
goto :EOF
|





nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]