長整数の掛け算は4桁ずつにわければ簡単です。しかし割り算は難しいです。ここでは手抜きしています。除数は32ビットの整数を使って、被除数を4桁に分けています。しかし、除数は最大6桁で、余りも最大6桁になるので1万倍したら10桁になってオーバーフローします。
大きさの比較は、同じ4桁ずつの区切りで比較します。
:greater_equal if "%1" == "" exit /b 1 if %1 GTR %2 exit /b 1 if %1 LSS %2 exit /b 0 call :greater_equal %3 %4 %5 %6 exit /b %ERRORLEVEL%
最初の4桁ずつを比較して、同じならシフトして自分を呼び出します。4つしか引数がないから%5はなさそうですが、値がセットされていないだけで使っても問題ないです。4回目が呼び出されたときに%1も値がセットされていないのでそのときは等しいと判定します。
@echo off set N=600851475143 set n1=%N:~0,-8% if "%n1%" == "" set /a n1 = 0 set n2=%N:~-8,-4% if "%n2%" == "" set /a n2 = 0 set /a n3 = %N:~-4% set /a p = 2 :loop call :mod %n1% %n2% %n3% %p% if %ERRORLEVEL% NEQ 0 ( set /a p += 1 goto :loop ) rem // n /= p set /a r1 = %n1% %% %p% set /a n1 /= %p% set /a n2 = %r1% * 10000 + %n2% set /a r2 = %n2% %% %p% set /a n2 /= %p% set /a n3 = (%r2% * 10000 + %n3%) / %p% rem // q = p * p set /a p1 = %p% / 10000 set /a p2 = %p% %% 10000 set /a q3 = %p2% * %p2% set /a q2 = 2 * %p1% * %p2% + %q3% / 10000 set /a q3 = %q3% %% 10000 set /a q1 = %p1% * %p1% + %q2% / 10000 set /a q2 = %q2% %% 10000 call :greater_equal %n1% %q1% %n2% %q2% %n3% %q3% if %ERRORLEVEL% == 1 goto :loop call :greater_equal %n1% 0 %n2% 0 %n3% 2 if %ERRORLEVEL% == 1 ( call :echo_long %n1% %n2% %n3% ) else ( echo %p% ) exit /b 0 :mod setlocal set /a d = %4 set /a r = ((%1 %% %d% * 10000 + %2) %% %d% * 10000 + %3) %% %d% exit /b %r% :greater_equal if "%1" == "" exit /b 1 if %1 GTR %2 exit /b 1 if %1 LSS %2 exit /b 0 call :greater_equal %3 %4 %5 %6 exit /b %ERRORLEVEL% :echo_long setlocal set /a n = (%1 * 10000 + %2) * 10000 + %3 echo %n%