14

私は基本的な Java 試験の過去の試験問題を練習していますが、数値が素数であるかどうかをテストするための for ループを機能させるのが難しいと感じています。より大きな数の効率測定を追加して複雑にしたくありません。少なくとも2桁の数で機能するものです。

現時点では、n が素数であっても常に false を返します。

私の問題は、for ループ自体と "return true;" をどこに置くかで何か問題が発生していることだと思います。そして「falseを返す;」...私が犯している本当に基本的な間違いだと確信しています...

public boolean isPrime(int n) {
    int i;
    for (i = 2; i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

stackoverflow の他の場所でヘルプを見つけることができなかった理由は、同様の質問が、より効率的な方法でより複雑な実装を求めていたためです。

4

12 に答える 12

31

次の方法で、はるかに早く停止してループをすばやくスキップできます。

public boolean isPrime(long n) {
    // fast even test.
    if(n > 2 && (n & 1) == 0)
       return false;
    // only odd factors need to be tested up to n^0.5
    for(int i = 3; i * i <= n; i += 2)
        if (n % i == 0) 
            return false;
    return true;
}
于 2013-02-01T16:18:56.783 に答える
31

あなたのforループには少し問題があります。そのはず: -

for (i = 2; i < n; i++)  // replace `i <= n` with `i < n`

もちろん、 をnで割った余りをチェックしたくはありませんn。それは常にあなたを与えます1

実際、条件を次のように変更することで、反復回数を減らすこともできますi <= n / 2nは より大きい数で割り切れないのでn / 2、 を考慮する場合を除き、 を考慮するn必要はまったくありません。

したがって、forループを次のように変更できます。

for (i = 2; i <= n / 2; i++)  
于 2013-02-01T16:10:51.213 に答える
3

i < n最後の反復ステップで が得られるため、 と書く必要がありますtrue

于 2013-02-01T16:11:55.207 に答える
3

エラーは i<=n です

for (i = 2; i<n; i++){
于 2013-02-01T16:12:24.380 に答える
2
public class PrimeNumberCheck {
  private static int maxNumberToCheck = 100;

  public PrimeNumberCheck() {
  }

    public static void main(String[] args) {
      PrimeNumberCheck primeNumberCheck = new PrimeNumberCheck();

      for(int ii=0;ii < maxNumberToCheck; ii++) {
        boolean isPrimeNumber = primeNumberCheck.isPrime(ii);

      System.out.println(ii + " is " + (isPrimeNumber == true ? "prime." : "not prime."));
    }
  }

  private boolean isPrime(int numberToCheck) {    
    boolean isPrime = true;

    if(numberToCheck < 2) {
      isPrime = false;
    }

    for(int ii=2;ii<numberToCheck;ii++) {
      if(numberToCheck%ii == 0) {
        isPrime = false;
        break;
      }
    }

    return isPrime;
  }
}
于 2013-02-01T17:31:13.670 に答える
1

3 で割り切れるこのコード番号では、for ループ コードの初期化がスキップされます。
for ループの反復も 3 の倍数をスキップします。

private static boolean isPrime(int n) {

    if ((n > 2 && (n & 1) == 0) // check is it even
       || n <= 1  //check for -ve
       || (n > 3 && (n % 3 ==  0))) {  //check for 3 divisiable
            return false;
    }

    int maxLookup = (int) Math.sqrt(n);
    for (int i = 3; (i+2) <= maxLookup; i = i + 6) {
        if (n % (i+2) == 0 || n % (i+4) == 0) {
            return false;
        }
    }
    return true;
}
于 2015-09-03T20:25:07.747 に答える
0

をチェックしているi<=nのでi==n、 の場合は 0 のみが返され、常に false が返されます。Tryi<=(n/2)までチェックする必要はありませんi<n

于 2013-02-01T16:11:29.780 に答える
0

上記のアルゴリズムは、そうではありませんが、1を素数として扱います。したがって、ここに解決策があります。

static boolean isPrime(int n) {
  int perfect_modulo = 0;
  boolean prime = false;

  for ( int i = 1; i <=  n; i++ ) {
    if ( n % i == 0 ) {
      perfect_modulo += 1;
    }
  }
  if ( perfect_modulo == 2 ) {
    prime = true;
  }

  return prime;
}
于 2014-08-13T17:57:59.820 に答える
0

さて、for ループには問題があります。これがコードです。

public static boolean checkPrimeNUmber(int number) 
{ 
   if(number <= 1) 
   { 
      return false; 
   } 
   for(int a = 2; a < Math.sqrt(number); a++) 
   { 
      if(number % a == 0) 
      { 
         return false; 
      } 
   } 
   return true;
}
于 2018-04-13T13:46:09.580 に答える