4

私はJavaプロジェクトに取り組んでおり、私を夢中にさせているループがあります。

プログラムは、正の整数である入力 N を取ります。私のループでやりたいことはこれです:

N = 10 とします。ループは 1 から 10 までのすべての数値を取り、それを 5 乗して、各値を長さ N の配列に格納します。

までは(一見)正しく動作するN = 73と思います。N74 以上になると、ランダムに 74^5 の負の数が表示され始めます。これは明らかに間違っています。数値が高いほど、ネガティブな印象を与えます。

private static int _theLimit = EquationSolver.getLimit(); //input "N"
private static int length = (int) (_theLimit); //length of possible solutions array = N
static int[] _solutions = new int[length]; 

public static void solutionRun() {
    for(int i = 1; i <=_theLimit ;) { 
        //theLimit refers to the input N; for numbers from 1 until N
        for (int p = 0; p <= _solutions.length-1; p++) { 
            //solutions is an array that stores all possible solutions to ^5 from 1 to N; 
            _solutions[p] = i*i*i*i*i; 
            //p refers to the array location, increments with each new i
            i++;
        }           
    }
    for(int q = 0; q<=_solutions.length-1; q++){ //outputs solutions for debugging purposes
        System.out.println(_solutions[q]);
    }
}
4

2 に答える 2

11

問題は、整数が許可する範囲を通過したことです。

Int-2,147,483,648から最大値2,147,483,647 (両端を含む)までの数値を許可 します ( source ) 74^5 = 2,219,006,624。したがって、より多くのIntことが処理できます。

より大きな範囲が必要な場合は、Java BigIntegerクラスを使用できます。コード例:

BigInteger pow(BigInteger base, BigInteger exponent) {
  BigInteger result = BigInteger.ONE;
  while (exponent.signum() > 0) {
    if (exponent.testBit(0)) result = result.multiply(base);
    base = base.multiply(base);
    exponent = exponent.shiftRight(1);
  }
  return result;
}

考慮事項: これはあまり効率的ではない可能性があり、負の基数または指数に対しては機能しない可能性があります。BigIntegers の使用方法の例として使用してください。

BigInteger の代わりに、9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までの範囲の型を使用することできますlong(ソース)

精度の問題doubleが発生する可能性があるため、この目的には使用しないでください。

于 2012-11-14T03:39:53.573 に答える
0

私はJavaで働いていませんが、これが役に立てば幸いです!

次のコマンドを試してください: public static final int MAX_VALUEint が現在の環境で取り得る最大値を確認するには。デフォルトは 2147483647 (2^31 - 1) です。74^5 = 2073071593 は機能しますが、75^5 = 2219006624 は高すぎます。BigIntegerを使用して数値範囲をサポートします。

于 2012-11-14T03:46:39.337 に答える