-4

10桁を超える数値を指定すると、どこでもデータ型Error:Integer too largeを使用しているにもかかわらず、エラーが発生します。long

これが私のプログラムです:

class q3 {
    boolean prime(long a) {
        long c=0;
        for(long i=1;i<=a;i++) {
            if(a%i==0) {
                c++;
            }
        }
        if(c==2) {
            return true;
        } else {
            return false;
        }
    }

    public void main(long a) { 
        boolean result=false;
            for(long i=1;i<=a/2;i++) {
                if(a%i==0) {
                    result=prime(i);
                } else {
                    result=false;
                }
                if(result==true) {
                    System.out.println(i);
                }
            }
    }
}
4

2 に答える 2

4

数値が大きすぎるというエラーが発生する可能性について、いくつかの説明があります。しかし、問題はあなたが提示したコードにはありません。

main問題は、次のようなメソッドを呼び出そうとしていることだと思います。

new q().main(1234567890);

1234567890はリテラルであり、intリテラルではないため、失敗しますlong。このように書いてください:

new q().main(1234567890L);

ノート:

  1. これは18〜19桁の数字で機能します。それを超えると、BigIntegerを使用する必要があります。
  2. その方法で素数性をテストすることは、多数の場合、非常に遅くなります。それを行うには、はるかに効率的な方法があります。これ、そしてこれを読んでください。
  3. この方法で素数性をテストしても、prime(a)メソッドはに達すると停止する可能性がありsqrt(a)ます。そして、すべてを数えるのではなく、何らかの要因(1より大きい)を見つけたら停止する必要があります。
于 2013-02-04T23:03:52.100 に答える
0

非常に多数の反復 ( longs など) に到達し始めると、ループから離れてforループの使用を開始したくなることがわかると思いますwhile

これがあなたが持っていたものです:

for(long i = 1; i <= a/2; i++)

しかし、forループは実際には可算集合を対象としています。intループの iterand としてan 以外のものがある場合はfor、2 番目と 3 番目の引数をより慎重に検討する必要があります。

i <= a/2;

ですか?a/2_ intそれはlongですか?書く必要がありますか:

i <= ((long) a)/2L;

突然、これははるかに複雑になります。あなたが書くとき:

i++;

++演算子が値に作用することを確実に知っていlongますか? おそらく。しかし、チェックする必要があります。

通常、深刻な数学的モデル/計算では、次のwhile理由でループが使用されます。

while(i < someValue)

あいまいさがほとんどなく、理解しやすいステートメントです。ループ内で( aまたは a などのi可能性があります)反復し、そのステートメントの引数について本当に理解する必要がある量を減らします。longBigIntegerwhilefor

プログラムに別の問題がある可能性があります。このクラスをどのように呼び出しているかを判断するのは困難です。しかし、どちらの方法でも、これらのループを書き直すことから始めるべきだと思います。

于 2013-02-04T23:23:10.983 に答える