1 .文字数を数えるためのアルゴリズム


まず、与えられた数が、何種類の数字で構成されているかを数えるためのアルゴリズムを考えてみる。

与えられた数を a とし、 b=a2 とする。
b の最下位の数字を知るためには、

の2通りの方法が考えられるが、一般に後者の方が処理が速いと考えられるので、
後者の方針に従って、アルゴリズムを考える。

c$= (b を文字列化したもの) = cutlspc(str(b))
d = (b の桁数) = len(c$)

とする。
また、各桁の数字の格納場所を、配列 z$(10)とする。これは10通りしかあり得ない。
f を文字数のカウンタとする。

c$ を右から順に見ていって、

  1. f = 1 とする
  2. 1 文字目は、z$(f) に格納
  3. 2 文字以降は、z$(1) から z$(f) までと比較し、
    を繰り返す
  4. c$ の一番左の文字まで比較し終ったら、処理は終了
    f が c$ の数字の種類の数を表す

アルゴリズムは以下の通り。

    b=a^2 : c$=cutlspc(str(b)) : d=len(c$)
    for i=d to 1 step -1 : f=0 : e$=mid(c$, i, 1)
        if f=0 then inc f : z$(f)=e$ : goto *
        for j=1 to f
            if e$=z$(j) then cancel for : goto *
        next j
        inc f : z$(f)=e$
◎      if f>2 then cancel for : goto ** : ' more than 3
 *  next i
    print a , b
**  return

a についてループさせて、その中で、このサブルーチンを呼ぶことにより、
とりあえず、2 種類の数字から構成される 2 乗数を探して見よう。
実行結果は、以下のとおり。
ここでは、自明なもの

は省く。

ab = a^2
11
12
15
21
22
121
144
225
441
484
26
38
88
109
173
676
1444
7744
11881
29929
212
235
264
3114
81619
44944
55225
69696
9696996
6661661161

実は現在発見されているのは、以上の 15個のみである。


この方面で攻めるのもいいが、サンプルがたった 15個では、あまりにも張り合いがない。
そこで文字数を 3 文字とし、問題を拡張して考えてみよう。
プログラムは◎のところを、

if f>2

から、

if f>3

に変更するだけである。


この章の目次

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典