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

Problem 16


21000を求めます。多倍長整数なので、計算が少し大変です。加算なら簡単です。1 + 1 = 2、2 + 2 = 4、4 + 4と計算していけば、1000回加算するだけです。加算は8桁ごとに区切って配列にしています。

@echo off

setlocal
echo %time%
set /a N = 1000
set /a a.size = 1
set /a a_0 = 1
for /L %%k in (1, 1, %N%) do (
        call :twice_long a
)
rem call :print_long a
call :sum_digits_long a
echo %ERRORLEVEL%
echo %time%
exit /b 0

rem // %1を2倍
:twice_long
    set /a size = "%1.size"
    set /a k = 0
    set /a carry = 0
    :loop_add_long
        set /a e = "%1_%k%" * 2 + %carry%
        if %e% GTR 100000000 (
            set /a %1_%k% = %e% - 100000000
            set /a carry = 1
        ) else (
                set /a %1_%k% = %e%
                set /a carry = 0
        )
        set /a k += 1
        if %k% LSS %size% goto loop_add_long
    
    if %carry% GTR 0 (
        set /a %1.size = %k% + 1
        set /a %1_%k% = %carry%
    )
    exit /b 0

:sum_digits_long
        setlocal
        set /a size = "%1.size"
        set /a s = 0
        set /a k = 0
        :loop_sum_digits_long
                set /a e = "%1_%k%"
                call :sum_digits %e%
                set /a s += %ERRORLEVEL%
                set /a k += 1
                if %k% LSS %size% goto :loop_sum_digits_long
        exit /b %s%

:sum_digits
        setlocal
        if "%1" == "" exit /b 0
        set /a n = %1
        call :sum_digits %n:~0,-1%
        set /a ret = %n:~-1% + %ERRORLEVEL%
        exit /b %ret%