如何将
a%b
与大整数一起使用?
喜欢
...
BigInteger val = new BigInteger("1254789363254125");
...
boolean odd(val){
if(val%2!=0)
return true;
return false;
...
Eclipse 表示 BigInteger 的运算符 % 未定义。
有什么想法吗?
像这样:
BigInteger val = new BigInteger("1254789363254125");
public boolean odd(BigInteger val) {
if(!val.mod(new BigInteger("2")).equals(BigInteger.ZERO))
return true;
return false;
}
或者正如用户 Duncan 在评论中建议的那样,我们可以像这样完全删除 if 语句:
BigInteger val = new BigInteger("1254789363254125");
public boolean odd(BigInteger val) {
return !val.mod(new BigInteger("2")).equals(BigInteger.ZERO));
}
更有效的方法是检查最后一位。
如果是
0
(又名函数 testBit(0)
将返回 false
,函数 odd(BigInteger)
将返回 true
),则数字为奇数,否则为偶数。
public boolean odd(BigInteger i) {
return !i.testBit(0);
}
odd(BigInteger.valueOf(1)); // false
odd(BigInteger.valueOf(2)); // true
odd(BigInteger.valueOf(101)); // false
odd(BigInteger.valueOf(100)); // true
而且代码行数也更少。
我会以这种方式使用 BigInteger 类的方法 remainder:
BigInteger result = a.remainder(b);
赋值是因为 BigInteger 是不可变的,所以 a 不会被该方法改变。
使用 val.mod(2)。
BigInteger 是一个对象。您不能在对象上使用算术运算符,它仅适用于基元。
% 仅适用于 java.lang.Integer,因为它被隐式转换(实际上,它被称为未装箱)为 int。但 BigInteger 无法拆箱。拆箱/装箱(即对象到基元/基元到对象的转换)仅适用于 int、float、double、short 和 byte。
由于 BigInteger 是一个类而不是原语*1,因此您不能对其使用运算符。检查 BigInteger 的方法:http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html#mod(java.math.BigInteger)
*1:对于 Integer、Float 的情况,可以使用运算符,因为 JVM 会自动将对象转换为其原始值(自动装箱)