配列と繰り返し


配列の利用法としては, 前のページの例のように読み出し専用の表として利 用するだけでなく, データ領域として利用することもできる. 有名な「エラ トステネスのふるい」のプログラムをJavaで書いたものを下にあげる.
class Primes{
  public static void main(String[] args){
   int n=1000,i,k;
   int p[]=new int[n+1];
   for(i=2; i<=n; i++) p[i]=1; // i++はi=i+1と同じ意味
   for(i=2; i<=n; i++) 
     if(p[i]==1){
        System.out.print(i+" ");
        for(k=2; i*k<=n; k++) p[i*k]=0;
     }
  }
}
このプログラムでは p という配列が使われている. iが素数の可能性がある 時はp[i]が1, 合成数の時はp[i]が0になるように計算していく. 配列の宣言と 作成は,
   int p[]=new int[n+1];
の部分である. これは,
   int p[];
   p=new int[n+1];
という2つの文に分けて書いても良い(続けて書かなくても良い). newは配列や オブジェクトの生成を表す予約語で, 次のintは要素の型を示す. [n+1]は作成 する配列の大きさ(要素数)が n+1 であることを示す. 配列の大きさを宣言時 に決定しなくてもよいのは, Javaの特徴の1つである.

上のプログラムで素数が求まる原理が分かりにくいかもしれない. は いぱーワークブック「プログラミング」でも 素数表のページでほとんど同じプログラムを扱っているので, 分からない人はそちらの説明を見て欲しい.

注)上のプログラムでは int の配列を使っているが, よりJavaらしく書くなら boolean(真偽値を表す型)の配列を使って

class PrimesWithBool{
  public static void main(String[] args){
   int n=1000,i,k;
   boolean p[]=new boolean[n+1];
   for(i=2; i<p.length; i++) p[i]=true;
   for(i=2; i<p.length; i++) 
     if(p[i]){
        System.out.print(i+" ");
        for(k=2; i*k<=n; k++) p[i*k]=false;
     }
  }
}
のように書く. なお配列型の変数に .lengthをつけて p.lengthのようにする と, その配列の要素数を返す.

次に進む