Java 为什么我的程序没有给出预期的输出?

Java 为什么我的程序没有给出预期的输出?,java,arraylist,biginteger,Java,Arraylist,Biginteger,我正在研究Euler项目的问题29,其中说明: 考虑2的a^b的所有整数组合≤ A.≤ 5和2≤ B≤ 5: 2^2=4,2^3=8,2^4=16,2^5=32 3^2=9,3^3=27,3^4=81,3^5=243 4^2=16,4^3=64,4^4=256,4^5=1024 5^2=25,5^3=125,5^4=625,5^5=3125 如果将它们按数字顺序排列,去掉任何重复项,我们将得到以下15个不同项的序列: 4、8、9、16、25、27、32、64、81、125、243、256、625

我正在研究Euler项目的问题29,其中说明:

考虑2的a^b的所有整数组合≤ A.≤ 5和2≤ B≤ 5:

2^2=4,2^3=8,2^4=16,2^5=32

3^2=9,3^3=27,3^4=81,3^5=243

4^2=16,4^3=64,4^4=256,4^5=1024

5^2=25,5^3=125,5^4=625,5^5=3125

如果将它们按数字顺序排列,去掉任何重复项,我们将得到以下15个不同项的序列:

4、8、9、16、25、27、32、64、81、125、243、256、625、1024、3125

ab为2生成的序列中有多少不同的项≤ A.≤ 100和2≤ B≤ 一百

我已经用Java编写了prgram来解决这个问题。但是,它运行时没有任何错误,没有给出预期的输出。我在下面提供了我的代码和输出

import java.util.ArrayList;
import java.math.BigInteger;
public class problemTwentyNine {
  public static void main(String [] args) {
    long start = System.nanoTime();
    ArrayList<BigInteger> distinctTerms = new ArrayList<BigInteger>();
    BigInteger temp;
    for(int i = 2; i <= 100; i++) {
      for(int j = 2; j <= 100; j++) {
        temp = new BigInteger("" + (int) (Math.pow(i, j)));
        if(!distinctTerms.contains(temp)) {
          distinctTerms.add(temp);
        }
      }
    }
    System.out.println(distinctTerms.size());
    long stop = System.nanoTime();
    System.out.println("Execution time: " + ((stop - start) / 1e+6) + "ms");
  }
}
import java.util.ArrayList;
导入java.math.biginger;
公共类问题29{
公共静态void main(字符串[]args){
长启动=System.nanoTime();
ArrayList distinctTerms=新的ArrayList();
大整数温度;
对于(int i=2;i行
(int)(Math.pow(i,j))
没有多大意义,因为
100^100
远大于
Integer.MAX\u值
。您应该使用
biginger
进行幂运算

应该是

temp = BigInteger.valueOf(i).pow(j);

您仅获得422个不同元素的原因是您的值太大,并且您要将它们强制转换为
int

Math.pow(i,j)
(a
double
)的结果大于
Integer.MAX_值
,并将其转换为
int
,则结果为
Integer.MAX_值

涵盖此缩小原语转换:

否则,以下两种情况之一必须为真:

  • 该值必须太小(大数值的负值或负无穷大),并且第一步的结果是int或long类型的最小可表示值

  • 该值必须太大(大数值的正值或正无穷大),并且第一步的结果是int或long类型的最大可表示值

(强调矿山)

你得到的结果很多,所以只有422个不同的结果

将计算更改为
biginger
math

temp = new BigInteger("" + i).pow(j);

有了这个改变,我现在得到了9183个不同的元素。这更有意义,因为一些完美平方的幂将被重复。

我个人更喜欢
biginger.valueOf(I)
@pbabcdefp@rgettman谢谢你的回答,这非常有帮助,尽管如前所述,我相信
biginger.valueOf(I)
是一种更好的方法。@Joffrey,这将适用于整数;我习惯于将
字符串
传递给
大整数
,以便对所有情况进行精确表示。@pbabcdefp已经回答了我要说的内容,但作为旁白,您也可以使用
而不是
数组列表
,以避免执行现有操作nce检查您自己。您应该使用set,因为它不允许重复并稍微清除您的代码。例如:set distinctTerms=new HashSet();