0

私は多かれ少なかれ完全にJavaに慣れていません。練習として、100 未満の素数のリストをコンソールに出力するための単純なループを作成しようと思いましたが、おそらくこの質問のタイトルからわかるように、それが与えるのは 2 だけです。コードの編集と実行に Eclipse を使用しています。ここにあります:

    public class PrimeGen {

        public static void main(String[] args) {

            for (int num = 1,     // number to test
                     testfac = 1, // start factor to divide into num
                     numfacs = 0; // number of factors in current iteration of num
                 num <= 100;
                 num++)
            {
                while (testfac <= num){
                    if (num/testfac == Math.round(num/testfac)) numfacs++; // add 1 to numfacs if it divides evenly
                    testfac++;
                }
                if (numfacs == 2) System.out.println(num);
                numfacs = 0;
                testfac = 1;
            }
        }
    }

誰かがこれで私を助けることができれば、私は非常に感謝しています. ありがとうございました!

4

3 に答える 3

1

に置き換えif (num/testfac == Math.round(num/testfac))ますif (num % testfac == 0)

整数除算を行っているため、問題はMath.round(num/testfac)常に等しくなります。num/testfac% を使用して、割り切れるかどうかを確認します。

于 2013-05-23T16:52:45.823 に答える
0

次のように割り切れるかどうかをテストします

if (num % testfac == 0)

また、すべての数値は 1 で割り切れるので、割り切れるかどうかをチェックしないことでループ サイクルを節約できます。から始めtestfac = 2ます。ループwhile (testfac < num)してチェックしif (numfacs > 0)ます。

于 2013-05-23T17:00:29.893 に答える
0

もう少し最適化された方法は method2 です。

public static void main(String[] args)
{
    int N = 100000;
    long t1 = System.currentTimeMillis();
    int[] v1 = method1(N);
    long t2 = System.currentTimeMillis();
    int[] v2 = method2(N);
    long t3 = System.currentTimeMillis();

    System.out.println( "m1:"+(t2-t1)+"  m2:"+(t3-t2) );

    int m1=0,m2=0;
    for(int i=0; i<N; i++) if(v1[i]==1) m1++;
    System.out.println();
    for(int i=0; i<N; i++) if(v2[i]==0) m2++;
    assert m1 == m2;
    System.out.println(m1+" == "+m2);

}

public static int[] method1(int N)
{
    int[] vector = new int[N];

    for (int num = 1,     // number to test
            testfac = 1, // start factor to divide into num
            numfacs = 0; // number of factors in current iteration of num
            num <= N;
            num++)
    {
        while (testfac <= num){
            if (num % testfac == 0 ) numfacs++; // add 1 to numfacs if it divides evenly
            testfac++;
        }
        if (numfacs == 2) vector[num]=1;
        numfacs = 0;
        testfac = 1;
    }
    return vector;
}

public static int[] method2(int N)
{
    int[] vector = new int[N];
    vector[0]=1;
    vector[1]=1;

    for(int n=2; n<N/2; n++ )
    {
        if(vector[n]==1)
            continue;
        int m=n;
        for(int i=2; ;i++)
        {
            m = i*n;
            if(m>=N)
                break;
            vector[m]=1;
        }
    }
    return vector;
}
于 2013-05-23T17:29:35.943 に答える