早くも難問がやってきました。これは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