2

Javaで特定の条件で素数を見つけようとしています。

課題は、「3」を 4 回含むすべての素数 (100.000 未満) を表示することです。100.000 未満のすべての素数を示すコードを既に持っていますが、数字「3」を含む素数を 4 回数える方法がわかりません。しかし、私はすべての素数を数えることができます。

誰かがこれで私を助けることができますか?

これが私が持っているコードです。数字を文字列に入れる場所はどこですか?

    package Proeftentamen;

import java.util.regex.*;

/**
 *
 * @author Stefan
 */
public class Vraag_6 {

    /// priemgetallen waar 4x een 3 in voor komt???? wtf...
    public static void main(String[] args) {
        boolean[] lijst = new boolean[1000000]; // hoeveelheid getallen
        vularray(lijst);
        lijst = zeef(lijst);
        drukaf(lijst);
    }

    public static void vularray(boolean[] lijst) {
        for (int i = 2; i < lijst.length; i++) {
            lijst[i] = true;
        }
    }

    public static boolean[] zeef(boolean[] lijst) {
        for (int i = 2; i < lijst.length / 2; i++) {
            if (lijst[i]) {
                for (int j = 2 * i; j < lijst.length; j += i) {
                    lijst[j] = false;
                }
            }
        }
        return lijst;
    }

    public static void drukaf(boolean[] lijst) {
        int count = 0;
        for (int i = 2; i < lijst.length; i++) {
            if (lijst[i] == true) {
                System.out.println(i + " " + lijst[i]);
                count++;
            }
        }
        System.out.println("Aantal priemgetallen: " + count);
    }
}
4

6 に答える 6

3

この質問は本当に宿題のように聞こえるので、あなたはあなたが思いついたものとあなたがこれまでに試したことを書き留めるべきです。

数を数える方法はたくさんあります。手がかりを与えるために、リマインダー操作を使用できます(Javaの場合- %):

56 % 10 = 6
25 % 5  = 0

したがって、10で割ってリマインダー操作を使用すると、番号の最後の桁を取得できます。ここで、ループとカウンターを使用すると、問題はありません。

別のオプション(非常に醜いので、実際には使用しないでください:))-番号をaに変換し、Stringその文字を反復(ループ)します。

これがお役に立てば幸いです。

于 2012-07-03T13:32:22.690 に答える
3

このコードは、数字に 4 つの「3」がある数字の 50 順列を生成するため、各数字が素数かどうかを確認してください

public void generateNumbers() {
    StringBuilder s = new StringBuilder();
    s.append("3333");
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j <= 9; j++) {
            if (j%3==0) continue;
            s.insert(i,String.valueOf(j));
            int number=Integer.parseInt(s.toString());
            System.out.println(number);
            s.delete(i,i+1);
        }
    }


}
于 2012-07-03T14:20:21.650 に答える
1
  1. 各素数を反復します。
  2. 素数ごとに、Integer.toString(int) 静的メソッドを使用して文字列に変換します。
  3. この文字列を使用して、すべての文字を反復し (for ループと非静的メソッド String.charAt(int index) を使用)、メソッドが「3」を返す回数をカウントします。(文字列「3」ではなく、文字「3」)。

素数の文字列の配列に別の目的がない限り、わざわざループの外に格納しないでください。

于 2012-07-03T13:35:01.517 に答える
0

最大で5桁しかなく、そのうち4桁は3でなければなりません。では、残りの桁について何と言えますか?

結果の数値を手作業で書き出して、それぞれの素数性をテストすることは難しくありません。テストする数値は50を超えないため、オッズによる最も単純な試行除算でも問題ありません。

ただし、プログラムで数値を生成する場合は、5つのループで実行します。9回に追加10,000します。9回03333に追加1,000します。9回30333に追加100します。33033など。C++の場合:

int results[50];
int n_res = 0;
int a[5] = {13333, 31333, 33133, 33313, 33331};
for( int i=0, d=10000; i<5; ++i, d/=10)
  for( int j=1; j<9; ++j, a[i]+=d )
    if( is_prime(a[i]) )
      results[n_res++] = a[i];
于 2012-07-04T06:21:43.577 に答える
0

エラトステネスの篩primesに関する演習の関数と、標準プレリュードのおよび関数を使用して、この Scheme 式は 7 つの解を見つけます。digitsfilter

(filter
  (lambda (n)
    (= (length
         (filter
           (lambda (d) (= d 3))
           (digits n)))
       4))
  (primes 100000))

外側のフィルターは、100000 未満のすべての素数に対して実行され、それぞれに外側のラムダのテストを適用します。内部フィルターは各素数の数字を計算し、3 のみを保持します。次に、長さ関数がそれらをカウントし、等式述語が 4 つの 3 を持つもののみを保持します。プログラムを実行して、http://codepad.org/e98fow2uで解決策を確認できます。

于 2012-07-03T16:19:11.580 に答える
0

そのようなすべてを検証するには、以下のコードを参照してくださいprime numbers

void getPrimes(int num ,int frequency,char digit) {

    int count = 0;
    String number=Integer.toString(num);

    for (int i = 0; i < number.length(); i++) {
        if (count < frequency) {
            if (number.charAt(i) == digit)
                count++;
        }
        if (count == frequency)
        {
            System.out.println(number);
            return ;
        }

    }

}
于 2012-07-03T14:10:22.067 に答える