0
//Prime Number Calculator

import java.util.Scanner;

class PrimeNumbers {
    public static void main(String[] args){
        int End;
        int Begin;  

        Scanner in = new Scanner(System.in);

        //insert max value for the calculator.
        System.out.println("Where should I stop?");
        End = in.nextInt();

        for (Begin=3; Begin<=End; Begin++){
            System.out.println(Begin);
            int Prime;
            int PrimeList[] ;

            //something is wrong around here... I don't understand what...

            for (Prime:PrimeList); 
                PrimeList[0]=2;
            if(Begin%PrimeList[Prime]!=0){
                break;
            }
        }
    }    
}

素数計算機がたくさんあることは知っていますが、学校用に作りたかったのですが、どこで間違ったのかわかりません。

エラーメッセージ:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Syntax error on token "Prime", Identifier expected after this token
Prime cannot be resolved to a type
Type mismatch: cannot convert from element type int to Prime

at PrimeNumbers.main(PrimeNumbers.java:25)
4

6 に答える 6

4

わかりました、あなたのコードにはいくつかの問題があります (わかりました、それ以上かもしれません)。

問題 1:

まず最初に。常に Java 命名規則に従ってください。変数名とメソッド名は小文字のアルファベットで始める必要があります。そう:

int End;   // Should be `int end;`
int Begin; // Should be `int begin;`

問題 2:

配列参照を宣言したばかりで、初期化していません。以下のステートメントは、int 型の配列参照を宣言しているだけです。

int PrimeList[] ;

配列オブジェクトを作成し、参照を割り当てる必要があります。

int PrimeList[] = new int[size];

問題 3:

この問題は、問題 2の延長です。ループの反復ごとに新しい配列を初期化していることに注意してください。したがって、すべての素数が同じ場所に蓄積されることはありません。むしろ、array各反復の後にクリアします。ループ内からその配列宣言を削除する必要があります。

ここで、ループの外側に配列宣言を追加するのでArrayListはなく、動的に増加する配列である an を代わりに使用することをお勧めします。したがって、初期サイズを指定する必要はありません。

したがって、以下の宣言を外側 forのループの外側に追加できます。

List<Integer> primeList = new ArrayList<Integer>();

問題 4:

内側の forループに進みましょう。

for (Prime:PrimeList); 
    PrimeList[0]=2;
    if(Begin % PrimeList[Prime] != 0){
        break;
    }
}

今のところ、そのループはまったく必要ないので、そのループの問題点は忘れてください。をまだ初期化していませんlist。したがって、それを繰り返しても意味がありません。むしろ、指定された範囲内の素数で初期化する必要があります。

したがって、 for ループでarray / listを反復するのではなく、素数かどうかにかかわらず、現在テストしている数値をテストする必要があります。プライムの場合は、リストに追加します。また、素数をテストするには、数値ごとにループが必要です。そのロジックを別の方法で移動することをお勧めします。ある数値が素数かどうかを調べるには、 から2までの数値で割り続けますnum / 2。そして、あなたがそれを見るとすぐにmodulus = 0return falseそうでなければreturn true: -

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

さて、元の方法に戻りましょう。そして、外側のループを見てください:

for (begin=3; begin <= end; begin++) {
    /** For each number, check whether it's prime or not **/
    if (isPrime(begin)) {
        /** Is Prime, add it to list **/
        primeList.add(begin);
    }
}

これでした。ここで、回答を段階的に確認し、各問題を個別に解決することをお勧めします。

于 2013-02-05T12:34:30.583 に答える
1

他の人が述べたように、PrimeList配列を初期化していません。


コードに関するその他の提案。

  1. 取得している入力に対して検証を行う必要があります。同じことについては、例外処理を確認してください。たとえば、ユーザーが期待した数字を入力しなかった場合、コードは壊れます。

  2. 変数名は Java-bean 仕様の形式ではありません。つまり、最初の文字はスモール キャップにし、変数名の次の各単語の最初の文字を大文字にするキャメルケース表記に従う必要があります。

  3. アルゴは完全に間違っているようです。PrimeList は、別のコードで生成し、上記のコードに統合していない限り、どこにも入力されていません。

于 2013-02-05T12:29:37.533 に答える
1

Java では、配列はオブジェクトであり、 を使用して初期化する必要がありますnew

int[] PrimeList = new int[10];
于 2013-02-05T12:17:48.510 に答える
1

for ループに構文エラーがあります。そのはず

for (int prime: primeList) {

短い for ループには、反復で使用される変数の型が必要です

于 2013-02-05T12:31:11.073 に答える
-1

たとえば、配列を開始する必要があります。

int PrimeList[] = new int[3]
于 2013-02-05T12:17:59.113 に答える
-1

変数int Prime;int PrimeList[];

それらを次のように初期化します

int Prime = 0;
int PrimeList[] = new PrimeList[10];
于 2013-02-05T12:21:59.957 に答える