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

Problem 30

この問題は、限界の大きさが簡単に求められるのであとはしらみつぶしです。ただ4乗で8分かかったので、5乗だと100分くらいかかりそうです。

@echo off

setlocal enabledelayedexpansion
set /a N = 4
call :calc_pows pows %N%
call :calc_max_n %N%
set /a max_n = %ERRORLEVEL%
set /a s = 0
for /L %%n in (2, 1, %max_n%) do (
    call :sum_digits_pow %%n
    if !ERRORLEVEL! == %%n set /a s += %%n
)
echo %s%
exit /b 0

:calc_pows
    for /L %%d in (0, 1, 9) do (
        call :pow %%d %2
        set /a %1_%%d = !ERRORLEVEL!
    )
    exit /b 0

:calc_max_n
    setlocal
    set /a e = 1
    set /a mm = 0
    :loop_calc_max_n
        set /a m = n * %pows_9%
        set /a mm = %mm% * 10 + 9
        if %m% LSS %mm% exit /b %m%
        goto :loop_calc_max_n

:sum_digits_pow
    setlocal
    if %1 == 0 exit /b 0
    set /a div = %1 / 10
    set /a d = %1 %% 10
    call :sum_digits_pow %div%
    set /a m = "pows_%d%" + %ERRORLEVEL%
    exit /b %m%

:pow
    setlocal
    set /a p = 1
    for /L %%e in (1, 1, %2) do set /a p *= %1
    exit /b %p%