import java.io.*; import java.math.*; //==========================================================C // NP番までの素数の計算 C // NP <= NPTB(1千万) C // 素数の値はPTB[k], k=0〜NP-1に入る C // IWKは素数ふるいのワークエリア C //==========================================================C // 作成 後 保範 (Ushiro Yasunori), 2008/09/01 C // ( 東京工芸大学 )          C //==========================================================C public class Prime{ // 計算領域 static int PTB[] = new int[10000000]; static int IWK[] = new int[100000]; static int NPTB=10000000, NIWK=100000; //==========================================================C // Main Program C //==========================================================C public static void main (String[] args) throws Exception { int NP, k, j, LC=10; long t1, t2; // 出力ファイルの指定及び画面からNP(素数の数)の入力 FileOutputStream fo = new FileOutputStream("Prime.txt"); PrintWriter out = new PrintWriter(fo,true); InputStreamReader in = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(in); System.out.println("求める素数の数を入れてください"); String input = br.readLine(); NP = Integer.parseInt(input); // NP番までの素数の計算 t1 = System.currentTimeMillis(); TPRIM(NP); t2 = System.currentTimeMillis(); double CPU = (t2 - t1)/1000.0; System.out.println("計算時間="+CPU+" 秒"); // 素数のファイルへの出力 for (k=0; k NO) { NE = NIWK; // NEは奇数に対し、ふるいをおこなう奇数の数 // NOは求めた最終素数番号 if(LPM <= 30000) NE = Math.min(LPM*LPM/2, NIWK); for (i=0; i NH) { break; } NS1 = j - (LPM+2)%j; if(NS1 == j) { NS1 = 0; } NS = (j*(NS1%2) + NS1)/2; // NSはLPM+2+2*NSがjで割れる値 (NS= NP) { break; } } } } }