0

私は Java の初心者で、最初の課題は "for" ループを実装することでした。このプログラムを C++ で作成し、Java でコンパイルしましたが、実行時にエラーが発生しました。誰が何が悪いのか教えてもらえますか?

import java.util.Scanner;
import java.util.Vector;

public class GlobalMembersMain
{

    public static Vector<Integer> get_prime_factors(int number)
    {

        Vector<Integer> primefactors = new Vector<Integer>();
        for (int j = 2; j <= number; j++)
        {
            if (number % j == 0)
            {
                primefactors.add(j);
                number = number / j;
                j = 1;
            }
        }
        return primefactors;
    }

    public static void main(String[] args)
    {
        int number;
        int count = 1;
        System.out.print("Enter integer to analyse:");
        System.out.print("\n");
        Scanner scan = new Scanner(System.in);
        number = scan.nextInt();
        Vector<Integer> primefactors = new Vector<Integer>();
        primefactors = get_prime_factors(number);
        System.out.print("Prime factors are ");
        for (int a = 0; a < primefactors.size() + 1; a++)
        {
            if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
            {
                count++;
            }
            else
            {
                System.out.print(primefactors.elementAt(a));
                System.out.print(" (");
                System.out.print(count);
                System.out.print(") ");
                count = 1;
            }
        }
        System.out.print("\n");
    }
}

出力:

Enter integer to analyse:
10
Prime factors are 2 (1) Exception in thread "main" java.lang.ArrayIndexOutOfBoun
dsException: 2 >= 2
        at java.util.Vector.elementAt(Unknown Source)
        at GlobalMembersMain.main(GlobalMembersMain.java:36)
4

4 に答える 4

7
    for (int a = 0; a < primefactors.size() + 1; a++)
    {
        if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
        {
            count++;
        }

primefactorsコレクションのサイズを超えています。実際、2までです。

primefactors.size() - 1このエラーを回避するには、 に変更してください。

于 2012-11-16T20:32:51.270 に答える
2

配列はゼロベースであり、あなたが認識していると思います。あなたが気付いていないかもしれないことは、Java では aListも配列によって支えられているということです。呼び出すprimefactors.size() +1と、必要以上に1つ多く取得されます。たとえば、pf のサイズが 1 の場合、ループは次のようになります。

pf.get(0);  //returns the only value in the list  
pf.get(1); // element doesn't exist

Vectorもう 1 つは、一般的に Java で言えば、を使用したくないということです。シンクロコレクションです。必要なのは List/ArrayList です。

その他のコードの問題

public static Vector<Integer> get_prime_factors(int number)

これは静的である必要はありません。また、命名規則はJavaのキャメルケースであるため、関数名は次のようにする必要がありますgetPrimeFactors(int number)

GlobalMembersMain

GlobalMemberクラスは本質的に単数であるため、名前を付ける必要がある可能性が高くMain、主な機能を保持するクラスであることを示すために追加したと思います。

メイン関数では、次のようにします。

GlobalMember メンバー = 新しい GlobalMember();
member.getPrimeFactors(数値);

于 2012-11-16T20:40:09.560 に答える
0

Java の配列、リスト、ベクトルはゼロから始まることに注意してください。あなたの場合、primefactorsベクトルは 2 つの要素で構成され、それぞれインデックス 0 と 1 で利用できます。

あなたが直面している問題は、primefactors.elementAt(2)存在しない要素にアクセスしようとすることです。

1 つの問題は、ループ内のブレーク条件です。

for (int a = 0; a < primefactors.size() + 1; a++) { 
    // ... 
}

1 回目aは 0 になり、2 回目1はどちらも問題ありません。ただし、は よりも小さい 2 に等しいため、ループは3 回目に中断されません。その結果、存在しないへの呼び出しが発生し、プログラムが爆発します。aprimefactors.size() + 1primefactors.elementAt(2)

比較中にループ変数を 1 ずつインクリメントするため、ループ内には 2 つ目の問題もあります。

if (primefactors.elementAt(a) == primefactors.elementAt(a+1)) { 
    // ... 
}

繰り返しますが、引数として 2 を渡すと、プログラムは失敗します。primefactors.elementAt(...)

于 2012-11-16T21:32:16.777 に答える
0

問題は次のとおりです。

for (int a = 0; a < primefactors.size() + 1; a++)
    {
        if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
        {
            count++;
       }

//...

primefactors.elementAt(a+1)コレクションの最後の要素は例外 (AIOB) をスローします。

于 2012-11-16T20:35:51.580 に答える