1

1 から 100 までのすべての素数を見つける述語メソッドを使用するプログラムを作成しようとしています。素数を見つけるためのより効率的な方法があることは知っていますが、今のところ、ブルートフォース戦略を使用して、可能なすべての組み合わせを試してみたいと思います.

現在、プログラムはそのままで、true または false を 10,000 回出力するだけですが、私のプログラムでは、数字が素数の場合にのみ数字を出力したいと考えています。プログラムが完了すると、1 から 100 までの素数のリストができます。

1. 私のプログラムは、私がやろうとしていることに対して正しいですか? 2. 1 から 100 までのすべての素数をリストするように、プログラムを変更することを提案するのは良いことです。

import acm.program.*;
public class PrimeNumbers extends ConsoleProgram{
public void run(){

    for (int i =1; i <= 100, i++){
        for (int j =1; j<= 100; j++){
           println(yesPrime(i, j));
       }
     }
   }

private boolean yesPrime (int n, int k){
      return ( n % k == 0)

       }
    }
  }
4

11 に答える 11

10

素数をチェックしていません。1 から 100 までの 2 つの数値の 10,000 の組み合わせすべてをテストして、2 番目の数値が最初の数値を均等に分割するかどうかを確認します。

しかし、それはおそらく正しく行われています。

やりたいことの擬似コード:

for each number n from 2:100
    for each divisor d from 2:n-1
        test to see if d divided n evenly
    end for
    if no values of d other than n divided n evenly
        print "n is prime"
end for

熟考するためのいくつかの最適化:

  • 内側のループは sqrt(n) まで上がるだけです。(どうして?)
  • すべての数の代わりに、既に見つけた奇素数を均等に分割するかどうかを確認するだけで済みます。(どうして?)

楽しむ!

于 2013-05-22T03:24:43.667 に答える
3

エラトステネスのふるいの使用:

public static void main(String[] args) {

    int n = 100; // the max number for test

    // Sieve of Eratosthenes
    boolean[] sieve = new boolean[n + 1];
    for (int i = 2; i <= n; i++) {
        sieve[i] = true;
    }
    for (int i = 2; i <= n; i++) {
        if (sieve[i] != false) {
            for (int j = i; j * i <= n; j++) {
                sieve[i * j] = false;
            }
        }
    }

    // Print prime numbers
    for (int i = 0; i <= n; i++) {
        if (sieve[i]) {
            System.out.println(i);
        }
    }

}
于 2013-05-22T04:24:56.903 に答える
1

さて、あなたは から比較を返し、yesPrimeその比較の結果を に出力していrunます。出力がどうなるかを推測します。

これは宿題だと思って、答えではなくヒントをあげたいと思います。

の結果を確認しyesPrimeます。true の場合、数値を出力してループから抜け出します。

于 2013-05-22T03:26:43.033 に答える
1
    Scanner reader = new Scanner(System.in);
    System.out.println("Enter the a number");
    int num = reader.nextInt();
    int counter = 0;
    int root = 0;
    boolean prime_flag;

    if (2 <= num) {
        // 2 is the only even prime number
        counter++;
    }

    for (int i = 3; i < (num + 1); i++) {

        // test only for odd number
        if (i % 2 != 0) {
            prime_flag = true;
            root = (int) (Math.sqrt(i) + 1);

            for (int j = 3; j < (root + 1); j++) {
                if ((i % j == 0) && (i != j)) {

                    prime_flag = false;
                    break;
                }
            }

            if (prime_flag) {
                counter++;
            }

        }

    }

    System.out.println("Count of prime numbers upto " + num + " is "
            + counter);
于 2015-03-10T17:32:18.247 に答える
0
public static void main(String[] args) {

    boolean isPrime = true;             //set isPrime to true

    for (int i = 2; i<100;i++){          // consider i is increasing number

        for (int j=2; j<i; j++)           //j is divisor & must be less than
                                         //i and increasing after each iteration
        {
            if((i % j)== 0){             // if i gets divisible by 
                                         // any increasing value of j from 2
                                        //then enters in this case and makes value
                                        //nonPrime
                isPrime=false;     //changes value
            break;                   //breaks "for loop of j"
        }
            }               //ends "for loop of j"
        if(isPrime)            // if case wont work then number is prime
        {

            System.out.println(i + " is Prime");
        }
        isPrime = true;       //sets isPrime to default true. 
    }
    }
于 2014-02-04T18:37:06.590 に答える
0

特定の範囲で素数を簡単に見つける /* このメソッドを実装して、特定の範囲内のすべての素数のリストを返します (包括的)。素数は、1 と素数自体の 2 つの異なる自然数の約数を持つ自然数です。最初の素数は次のとおりです: 2、3、5、7、11、13 */

public void getPrimeNumbers(int st, int en){
    // int st=1, en=100;
    for(int i=st;i<=en;i++)
        if( (i%2!=0) && (i%1==0 && i%i==0) )
            System.out.println("Yes prime");      
}
于 2014-01-10T04:33:17.937 に答える
0

私はあなたの関数のような関数を作りますyesPrime。これは 1 つの数値だけを取り、その数値が素数かどうかを確認します。

何かのようなもの

boolean yesPrime(int n)
{
    // check to see if n is divisble by numbers between 2 and sqrt(n)
    // if the number is divisible, it is not prime, so return false
    // after the loop has checked all numbers up to sqrt(n), n must be prime so return true
}

次に、メイン プログラムで 1 から 100 までの数字をループし、それぞれの数字に対して yesPrime を呼び出します。結果が true の場合、その数値を出力します。

私の推論は、プログラミングの 1 つの目標は、問題をより小さなサブ問題に分割することであるということです。素数をテストする関数を作成することで、1 つの関数でネストされたループを使用することを回避できます。

于 2013-05-22T03:34:27.087 に答える