26.1.6.18 探索の例

値の探索方法を利用して,“2の100乗の結果の中のゼロのふたつ並び”を探してみましょう."12676....376"の中でゼロがふたつ並んでいるところを探します.プログラム"Doubling100"を利用します.

プログラム"Doubling100"では,結果は配列aに1桁ずつ格納されていましたから,結局

a[i]==0 && a[i+1]==0

となるiを求めればいいことになります.2か所以上あるかも知れませんが1番右,いいかえればiの値が一番小さい場所を求めるものとします.配列の長さは充分大きくとってあったので,大きい方の数桁はすべてゼロで,これが番兵に使えます.ただしそのためには,結果の最高桁の位置を知る必要があります.これは,頭の桁から“ゼロでないもの”を順に探すことによって得られます.

プログラムDoubling100の最後に,以下の部分をつけ加えればでき上がりです.

k=a.length-1;
while(a[k] == 0)
  k=k-1;   // 最高位桁を求める

i=0;
while(a[i] != 0 || a[i+1] != 0)
  i=i+1;

if(i > k)
   System.out.println("No \"00\" in 2**100");
else
   System.out.println("\"00\" is at "+ i +" in 2**100");

結果を示します.

0000000001267650600228229401496703205376 "00" is at 21 in 2**100

"21"は,上記結果の中央付近にある"0600228"の中の"00"の位置です.