按:一看标题,就有几个错误,一,整数没有最小;二,负数的绝对值是其相反数。但是,在这里,话题的约束是:在Java里去考虑。
本问题用到的类:
public class Mod {
public static void main(String[] args) {
final int MODULUS = 3;
int[] histogram = new int[MODULUS];
// Iterate over all ints (Idiom from Puzzle 26)
int i = Integer.MIN_VALUE;
do {
histogram[Math.abs(i) % MODULUS]++;
} while (i++ != Integer.MAX_VALUE);
for (int j = 0; j < MODULUS; j++) {
System.out.println(histogram[j] + " ");
}
}
}
运行,会抛错:
因为,Integer.MIN_VALUE % 3 == -2,而Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE,所以会出现上面的错误。
对于Math的abs(int)和abs(long)方法,Java API docs里说明了例外的情况,那就是如果参数是Integer.MIN_VALUE或者Long.MIN_VALUE,返回值是其本身。这个是Java在具体实现的时候,无可奈何的,Integer和Long用补码表示,负数的个数比整数多一,导致最小的负数的相反数没有对应的正数去表达,而按照补码的规则,算下来,竟然是其自身。
附