バッチファイルでProject Euler(19)

Problem 7

素数の判定を再帰にするとさすがに遅いのでループにします。

:is_prime
    setlocal
    set /a n = %1
    set /a k = 2
    :loop_is_prime
        set /a k_sq = %k% * %k%
        if %k_sq% GTR %n% exit /b 1
        set /a r = %n% %% %k%
        if %r% == 0 exit /b 0
        set /a k += 1
        goto :loop_is_prime

そんなに速くなりませんね。
偶数を最初から考慮しないと速くなります。これで1時間以内に答えが出ました。

@echo off

call :get_time
set /a t0 = %ERRORLEVEL%
set /a N = 10001
set /a counter = 1
set /a m = 3
:loop
    call :is_prime %m%
    if %ERRORLEVEL% == 1 (
        set /a counter += 1
    )
    if %counter% LSS %N% (
        set /a m += 2
        goto :loop
    )

call :get_time
set /a t = %ERRORLEVEL% - %t0%
echo %t:~0,-2%.%t:~-2%s
echo %m%
exit /b 0

:is_prime
    setlocal
    set /a n = %1
    set /a k = 3
    :loop_is_prime
        set /a k_sq = %k% * %k%
        if %k_sq% GTR %n% exit /b 1
        set /a r = %n% %% %k%
        if %r% == 0 exit /b 0
        set /a k += 2
        goto :loop_is_prime

:get_time
    setlocal
    set t=%TIME%
    set /a h = %t:~0,2%
    set /a m = 1%t:~3,2% %% 100
    set /a s = 1%t:~6,2% %% 100
    set /a ss = 1%t:~-2% %% 100
    set /a ret = ((%h% * 60 + %m%) * 60 + %s%) * 100 + %ss%
    exit /b %ret%