3

私は、私がやろうと思った興味深い質問を見つけました。ほとんどすぐに、修正できないように見える問題を見つけました。

コードを実行すると、エラーは発生しませんが、何も返さずに実行されるだけです。私のループは問題ないようで、素数を見つけるためのアルゴリズムが機能することはわかっているので、何が問題なのかわかりません。

多くの編集を行った後も、まだ同じ問題がありますが、実質的に同じコードを Python で実行すると、Python コードが実行され、実際に結果が返されます。変更されたコードは次のとおりです。

public class PrimeNumtoPi {

    static double pi = Math.PI;
    static double accuracy = 0.1;
    static int range = 10000;

    //checks whether an int is prime or not.
    static boolean isPrime(int n) {
        if(n % 2 == 0) {
            return false;
        } else {
            int i = 3;
            while (i < n / 2) {
                if(n % i == 0) {
                    return false;
                }
                i += 2;
            }
        }
        return true;
    }

    public static int nearestwhole(double n) {
        double remainder = n%1;
        if(remainder >= 0.5) {
            return (int) (n - remainder + 1);
        } else {
            return (int)(n - remainder);
        }
    }

    public static boolean isClose(double n) {
        if(abs(n - pi) < accuracy) {
            return true;
        } else {
            return false;
        }
    }

    public static double abs(double n) {
        if(n < 0) {
            return n * -1;
        } else {
            return n;
        }
    }

    public static void main(String[] args) {
        int current = 3;
        while(current <= range) {
            int numerator = nearestwhole(current * pi);
            if (isPrime(numerator)) {
                if(isClose(numerator/current) == true) {
                    System.out.println(numerator + " and " + current);
                }
            }
            current += 2;
            while(isPrime(current) == false) {
                current += 2;
            }
        }
    }
}
4

5 に答える 5

0

あなたのコードにはいくつかの問題があります:

  1. bj同時にインクリメントされるので、ここでif (b / j == pi)b/j常に 1 です
  2. 0,1 は素数ではないため、ループは 2 から開始する必要があります: for (int b = 2, j = 2; notequal == true;....)`
  3. if ((isPrime(b)) && (isPrime(j)))同じ番号がチェックされますprimeness
  4. 私は自分のマシンで実行されていることを確認しました。bjが同じであるため、永遠に実行されています。
于 2012-08-14T06:52:42.513 に答える
0

変数 numerator と current はどちらも int であるため、それらを割ると int が得られます。pi に最も近いのは 3 で、0.1 以上の差があります。つまり、isClose は決して true を返さないので、何も出力しません。アウト。

于 2014-11-11T01:14:05.390 に答える
0

考えられるすべての数字を比較する必要はなく、すべての数字を比較する必要もありません。PI を掛けると素数でもある素数を見つけたいとします。

public static void findSmallInt() {
    double pi = 3.1415;
    for (int i = 3; ; i += 2) {
        if (!isPrime(i)) continue;
        int num = (int) Math.round(i * pi);
        if (!isPrime(num)) continue;
        if (round4((double) num / i) == pi) {
            System.out.println(num + "/" + i + "= "+(double) num/i);
            break;
        }
    }
}

private static double round4(double v) {
    return Math.round(v * 1e4) / 1e4;
}

public static void main(String... args) {
    findSmallInt();
}

版画

977/311= 3.1414790996784565

これはまさにあなたが望むものではないかもしれませんが、これがはるかに簡単で高速であることがわかります。

于 2012-08-14T07:54:06.670 に答える
0

double について話すとき、完全な精度を期待することはできません。doubleは実数 (または有理数)ではありません。

任意の (自明ではない) 範囲には無数の有理数がありますが、それらを表すビット数は有限であることに注意してください。

したがって、2 つの double の同一性 (==) を比較しても、必要な結果が返されることはめったにありません

あなたの目的のために有効な代替手段は、必要な精度のレベルを制御できるJava のBigDecimalクラスを使用することです。

詳細については、倍精度に関するウィキペディアのページおよび/またはこの記事をお読みください。


また、 と は常に一緒に増加しているように見えbますjが、これはここでの別の問題です。ブルート フォース ソリューションには、1 つのループが両方を増加させるのではなく、それぞれが 1 つの変数を増加させる 2 つのネストされたループがあります。

最適化に関するコメント:エラトステネスのふるいを使用して、素数を見つける効率を向上させることができます。

于 2012-08-14T06:41:45.247 に答える
0
  1. j を 2 から b (パフォーマンスを向上させるには b/何か) まで実行します。

  2. あなたのPIは完璧ではないので、ある程度の許容範囲を期待していると思います. 2 つの素数を除算すると、一般に実数になり、PI と等しくなることはめったにありません。PI +/- 一部の許容範囲と比較して、ソリューションの可能性を高めることができます。

于 2012-08-14T07:02:13.160 に答える