我正在研究一个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]);
}
}
答案 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来支持您的号码范围。