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

Problem 3

早くも難問がやってきました。これは12桁で32ビットで表せないので難しいです。この問題が解ければいいというものでもありません。ある程度は一般化したいところです。ここでは、12桁までの場合になるべく解けるようにします。
まずはPythonで書いて、どこがネックになるかみてみましょう。

N = 600851475143
p = 2
while p * p <= N:
    if n % p != 0:
        p += 1
        continue
    
    n /= p

if n == 1:
    print p
else:
    print n

たぶん、これくらい簡単なロジックならバッチファイルにもできるでしょう。しかし、バッチファイルとしてはこれでも難しいのです。
まず、整数は4桁ずつに区切りましょう。

部分文字列

@echo off

set s=0123456789
echo %s:~1,4%
1234

%s:~1,4%でsの2文字目から4文字取ることができます。2つ目の数を省略すると、最後まで取ります。

echo %s:~1%
123456789

最初の数を負にすると最後から数えた位置を指定できます。

echo %s:~-3,2%
78

さらに、2番目の数を負にすると最後から数えた位置を指定できます。

echo %s:~-4,-1%
678

さて、4文字ずつに分割しましょう。例えば123456789なら、

1 2345 6789

と分割します。それはこうするとできます。

set /a N=123456789
set n1=%N:~0,-8%
set n2=%N:~-8,-4%
set n3=%N:~-4%

しかし、Nの桁数が少ないときにn1、n2が長さ0の文字列になってあとで都合が悪くなることがあります。こういうときは0をセットします。

if "%n1%" == "" set /a n1 = 0

引用符を使っているのは、

if %n1% ==  set /a n1 = 0

というのは成り立たないからです。ここでは引用符である必然性はありません。これでもOKです。

if a%n% == a set /a n = 0