1

2 から 1000 までのすべての素数を primes.txt という名前のファイルに書き込むコードを作成しています。何らかの理由で、この問題を解決する正しい方法を理解できません。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Problem6 {

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {
        PrintWriter prw = new PrintWriter("primes.txt");
        for (int i = 2; i <= 1000; i++){
            if (checkIfPrime(i) == true){
                System.out.println(i);
                prw.println(i);
            }
        }
    }

    public static boolean checkIfPrime (int num){
        boolean isPrime = true;  
        for (int i = 2; i <= 1000; i++){
            if ( num % i == 0 ){
                isPrime = false;
            }
        }

        return isPrime;
    }
}

どうすればいいのかわからない...助けてくださいありがとう!

4

5 に答える 5

6

2最初の数値 ,を に渡すとどうなりますcheckIfPrimeか? 2 を 2 で割った余りが 0 になり、2素数ではないと誤って主張します。

実際に に到達する前に、残りのテストを停止する必要がありますnum。に到達する前にifor ループを停止します。(実際には、が の平方根に達したら停止できます)。inuminum

for (int i = 2; i < num; i++){

あるいは

for (int i = 2; i <= Math.sqrt(num); i++){

冒険好きなら、エラトステネスの篩を実装してみてください。これは、すべての合成数を任意の制限 (この質問では 1000) までマークします。次に、残りの数字、つまり素数を出力します。

于 2013-09-06T22:20:30.920 に答える
3

割り算を素数だけで調べると計算がさらに速くなります。素数以外の数は、それ自体より小さい素数で割り切れます。

    static List<Integer> primes = new ArrayList<Integer>();

public static void main(String[] args) {
    for (int i = 2; i < 10000; i++) {
        if(checkPrime(i)){
            primes.add(i);
        }
    }
    System.out.println(primes);
}

private static boolean checkPrime(int n) {
    for (Integer i : primes) {
        if(i*i > n ){
            break;
        }else if(n%i==0 )
            return false;
     }
    return true;
}
于 2013-09-06T23:22:40.963 に答える
2

forあなたの状態をにcheckIfPrime(int num)変えてください

for (int i = 2; i < num; i++) {

ところで、次if (checkIfPrime(i) == true){のように書くことができますif (checkIfPrime(i)){

于 2013-09-06T22:19:58.080 に答える
1

1 より大きくより小さいnum他の数で割り切れない場合、その数は素数です。これはあなたのコードのどこにありますか? :-)num

于 2013-09-06T22:20:04.247 に答える
0

2-3-5-7 ホイールでエラトステネスの増分ふるいを「ハードコーディング」して、最大1000の素数を出力する方法を次に示します。Cライクな疑似コードでは、

primes_1000()
{
   // the 2-3-5-7 wheel
   int wh[48] = {10,2,4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,
                  2,4,8,6,4,6,2,4,6,2,6,6,4,2,4,6,2,6,4,2,4,2,10,2};
   // core primes' multiples, each with its pointer into the wheel
   int m[7][4] = { {1,11,11,11*11}, {2,13,13,13*13}, {3,17,17,17*17},
                   {4,19,19,19*19}, {5,23,23,23*23}, {6,29,29,29*29},
                   {7,31,31,31*31} };    // 23*23 = 529 
   int i=1, p=11, k=0;
   print(2); print(3); print(5); print(7);
   p = 11;             // first number on the wheel - the first candidate
   do {
      // the smallest duplicate multiple is 121*13, ==> no dups below 1000!
      for( k=0; k < 7; ++k) {
         if ( p == m[k][3] ) {             // p is a multiple of m[k][1] prime:
            m[k][2] += wh[ m[k][0]++ ];    //   next number on the wheel
            m[k][3]  = m[k][1] * m[k][2];  //   next multiple of m[k][1] 
            m[k][0] %= 48;                 //   index into the wheel
            break;
         }
      }
      if (k == 7) {    // multiple of no prime below 32 -
          print(p);    //   - a prime below 1000!   (32^2 = 1024)
      }
      p += wh[i++];    // next number on the candidates wheel
      i %= 48;         // wrap around to simulate circular list
   } while ( p < 1000 );
}

500未満の素数の場合、ホイールの固有の素数2,3,5,7を超える追加のコア素数{11,13,17,19}に対して、4 つのふるい変数のみを維持する必要があります。

( 1 から 100 までの素数の出力も参照してください)。

mは、ホイール上の基本素数とその倍数の辞書 (multiplesOf(p) = map( multiplyBy(p), rollWheelFrom(p) )であり、それぞれがホイールへの独自のインデックスを持ちます。実際には、倍数の値によって最小順序付けされた優先度キューである必要があります。

真の無制限のソリューションの場合、別の素数の供給を維持して、候補の中で次の素数の二乗に到達したときに素数ごとに辞書を拡張できます。

于 2014-02-19T14:58:52.047 に答える