第18講 素数・完全数・友愛数・フィボナッチ数列探索
第2話 素数探索プログラムの改良
解答コード例
import java.io.*;
class ss{
  static int[] x=new int[100000];
  static int n,cn;
  public static void main(String args[])throws IOException{
    BufferedReader u=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("探索範囲を入力してください。");
    System.out.print ("探索範囲=");
    int i;
    n=Integer.parseInt(u.readLine());
    double hj = System.currentTimeMillis();
    x[0]=2;
    cn=0;
    for(i=3;i<n;i+=2){
      if(f(i)){ //これはif(f(i)==true){と同じ。Javaは式自体が値をもつ。真のときはtrueであり、偽のときはfalseである。詳しくは下の解説を参照。
        cn++;
        x[cn]=i;
      }
    }
    double ow = System.currentTimeMillis();
    g();
    System.out.println("素数探索にかかった時間は"+(ow-hj)/1000+"秒です。");
  }
  public static boolean f(int a){
    int i;
    for(i=1;i<=cn;i++){
      if(x[i]>(int)(Math.sqrt(a)))break;
      if(a%x[i]==0)return(false);
    }
    return(true);
  }
  public static void g(){
    int i;
    for(i=0;i<=cn;i++){
      System.out.print(x[i]+" ");
      if(i>0 && i%10==0)System.out.println();
    }
    System.out.println();
    System.out.println("素数が"+(cn+1)+"個見つかりました。");
  }
      
}
コード解説
      if(f(i)){ //これはif(f(i)==true){と同じ。Javaは式自体が値をもつ。真のときはtrueであり、偽のときはfalseである。詳しくは下の解説を参照。
        cn++;
        x[cn]=i;
      }
は本サイトはじめての登場かと思いますので、解説しておきます。
一般に、
if(a<b)p;
は、a<bが真なら、命令pを実行しなさいでした。
これをもう少し正確に説明すると、式自体『a<b』の値がtrueなら、命令pを遂行し、falseなら何もするなです。
ですから、このif文は次のように書いてもよいのです。
if(a<b==true)p;
実はこれは私が知っている範囲(パスカル、VB、VBA、C、C++、VC++)のプログラミング言語に共通しています。
ですから、おそらく私が知っている範囲という限定は必要でないと予想されます。
ただ、VB,C、C++とJavaが違う点は、
VB,C、C++においては、a<b==trueはa<b==1(ただし、VBの場合はa<b=trueはa<b=1)と書いてもエラーしないのに対して、
Javaではエラーするということです。
式自体が、値をもつとはどういう意味???ですよね。
if文の中の条件式は、正しいか正しくないです。
言い換えると、真か偽です。
真のときその式の値が1(Javaの場合はtrue)であり、
偽のときその式の値が0(Javaの場合はfalse)なのです。
ですから、C++の場合
if(1)p;
と書けば無条件に命令p;が実行されます。
また、
if(0)p;
と書けば何もしません。
if(1)p;やif(0)p;はナンセンスですが、まだ学んでいないwhile文において
while(1){
   ・
}
(Javaであれば、
while(true){
   ・
}

と書くことには意味があります。
つまり、{}の中の処理を続けさせたい場合にこれを使えばよい訳です。
ただし、{}の中にループ処理を終わらせるための条件式を入れておかないと、
永久ループになってしまいます。
詳しくは、while文を学ぶところで説明します。


第1話の版と第2話の版の速度比較
以下は、1000000までの素数探索にかかった時間の比較です。
第1話版の場合
入門
第2話版の場合
Java
約2.5倍になりました。
奇数で割っていく方はかなり無駄があることがわかります。

さて、次話では完全数の探索を行います。
完全数とは
28=1+2+4+7+14
のように、自分自身を除くすべての約数の和と自分自身が一致する数です。
皆さんが工夫して完全数を探し出すプログラムを作り出してください。


第1話へ 第3話へ

戻る

VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部