4

我正在做一个java项目,我有一个让我发疯的循环。

该程序接受一个输入 N,它是一个正整数。我想要我的循环做的是:

假设 N = 10。循环将从 1 到 10 的所有数字,将其提高到五次方,并将每个值存储在长度为 N 的数组中。

我认为它(似乎)可以正常工作,直到N = 73。一旦N达到 74 或更高,它就会开始随机给我 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(包括)(来源)的数字,因为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,您还可以使用long从 - 9,223,372,036,854,775,8089,223,372,036,854,775,807(包括)(source)的类型。

不要double用于此目的,因为您可能会遇到精度问题

于 2012-11-14T03:39:53.573 回答
0

我不在Java中工作,但我希望这会有所帮助!

试试这个命令:public static final int MAX_VALUE查看 int 在当前环境中的最大值。默认值为 2147483647(即 2^31 - 1)。74^5 = 2073071593 有效,但是 75^5 = 2219006624 太高了。使用BigInteger支持您的数字范围。

于 2012-11-14T03:46:39.337 回答