ネタ心者歓迎! 今更ながらにJava相談室

このエントリーをはてなブックマークに追加
765 
↓素数判定のプログラム書きました。遅いです。もっと良い奴誰か教えてYO!
------------------------------------------------------------------------
public class PrimeChecker {
  private int[] preparedPrimes;//あらかじめ用意しておく素数の配列
 
  /** @param preparedLength あらかじめ用意しておく素数の数 */
  public PrimeChecker(int preparedLength) {
    preparedPrimes = new int[preparedLength];
    for (int i = 0, j = 2; i < preparedLength; i++) {
      while (true) {
        if (check(j, false) == -1) {
          preparedPrimes[i] = j;
          j++;
          break;
        }
        j++;
      }
    }
  }
   
  /**
   * @param target チェック対象の数
   * @param usePreparedPrimes trueならばあらかじめ用意してある素数を利用する
   * @return 素数ならば-1を返し、素数でないならば割れた数を返す
   */
  public int check(int target, boolean usePreparedPrimes) {
    if (target == 2) return -1;
    int divisor = 2; //この数でtargetを割る。約数の最小は2
    int limit = target; //この数に到達するまで割りつづける
    int index = preparedPrimes.length;
    if (usePreparedPrimes) index = 1;
    while (divisor <= limit) {
      if (target % divisor == 0) return divisor;
      if (index < preparedPrimes.length) {
        divisor = preparedPrimes[index];
        index++;
      } else {
        divisor++;
      }
      limit = target / divisor;
    }
    return -1;
  }
}
766 :01/11/18 00:42
↓続き
--------------------------------------------------
import java.io.*;

public class PrimeTest {
  /**
   * 指定した数までに存在する素数を割り出す。
   * [使用例] > java PrimeChecker 1000 prime.txt
   * 第1引数:指定する数
   * 第2引数:出力するファイル名(指定しない場合は、ファイル出力しない)
   */
  public static void main(String[] args) throws Exception {
    int maximum = Integer.parseInt(args[0]);
    PrintWriter out = null;
    if (args.length > 1) out = new PrintWriter(new BufferedWriter(new FileWriter(args[1])));
    PrimeChecker checker = new PrimeChecker(1000);//あらかじめ1000の素数を作るよ
    double twoPercent = maximum / 50;
    System.out.println("----+----+----+----+----+----+----+----+----+----+");
    double start = System.currentTimeMillis();
    int x = 10;
    for (int i = 2; i <= maximum; i++) {
      int result = checker.check(i, true);
      if (result == -1 && out != null) out.println(i);
      if ((double)i % twoPercent == 0.0f) System.out.print("*");
    }
    System.out.println();
    double end = System.currentTimeMillis();
    System.out.println((end - start) / 1000 + "秒");
    if (out != null) out.close();
  }
}
767デフォルトの名無しさん:01/11/18 00:45
今からジャヴァはじめようと思うんですが、
どんな本やサイトがおすすめですか?

教えてください。お願いします。
768766:01/11/18 00:46
main()に書いた使用例間違えたYO・・。

×> java PrimeChecker 1000 prime.txt
〇> java PrimeTest 1000 prime.txt