所以,我还是个用Java编码的新手,在尝试了ProjectEuler的 第29题我试着使用HashSets的蛮力解决,但如果HashSet被设置为存储Integer和Double值,即使它们总是相同的值,存储在HashSet中的值也是不同的。
ProjectEuler问题29:2≤a≤100,2≤b≤100,ab生成的序列中有多少个不同项?
请看下文。
// Java
private static int distinctAb(int start, int last) {
HashSet<Double> products = new HashSet<>();
for (int a = start; a <= last; a++) {
for (int b = start; b <= last; b++) {
double result = Math.pow(a, b);
products.add(result);
}
}
return products.size();
}
private static int distinctAbInt(int start, int last) {
HashSet<Integer> products = new HashSet<>();
for (int a = start; a <= last; a++) {
for (int b = start; b <= last; b++) {
double result = Math.pow(a, b);
products.add((int) result);
}
}
return products.size();
}
这两个片段的唯一区别是HashSet存储的是Integer或Double元素。start
和 end
分别为2和100。第一个方法使用Double产生9183(正确),但第二个方法使用Integer产生422(错误)。
HashSet的Integer元素是否有一个限制因素,使它产生不同的答案?
因为铸造一个非常大的 double
到 int
返回 Integer.MAX_VALUE
.
System.out.println((int) Math.pow(99,100)); // Prints 2147483647
System.out.println((int) Math.pow(100,100)); // Prints 2147483647
请看 证件 以找到 "缩小基元转换 "说:"该值一定是过大的(幅度大的正值或正无穷大),第一步的结果是类型int或long的最大可表示值。"