负数输出应为正数

时间:2012-11-14 03:36:19

标签: java math

我正在研究一个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]);
    }
}

2 个答案:

答案 0 :(得分:11)

问题是你刚刚传递了整数允许的范围。

Int允许 -2,147,483,648 中的数字达到最大值 2,147,483,647 (含)(source),因为74^5 = 2,219,006,624 。因此,Int可以处理的更多。

如果你想要更大的范围,你可以使用java BigInteger Class。代码示例:

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之外,您还可以使用{ - 1}}类型 - 9,223,372,036,854,775,808 9,223,372,036,854,775,807 (含)(source)。

不要将long用于此目的,因为您可以具有精确度problems

答案 1 :(得分:0)

我不使用Java,但我希望这有帮助!

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