2012-07-20 63 views
9

Cách sử dụng a%b với số nguyên lớn? như% toán tử cho BigInteger trong java

... 
BigInteger val = new BigInteger("1254789363254125"); 
... 

boolean odd(val){ 
    if(val%2!=0) 
     return true; 
    return false; 
... 

Eclipse nói rằng toán tử% không được xác định cho BigInteger.

Bất kỳ ý tưởng nào?

+3

Hãy xem chức năng 'mod' trong javadoc của BigInteger. –

Trả lời

19

Như thế này:

BigInteger val = new BigInteger("1254789363254125"); 
public boolean odd(BigInteger val) { 
    if(!val.mod(new BigInteger("2")).equals(BigInteger.ZERO)) 
     return true; 
    return false; 
} 

Hoặc là người dùng Duncan gợi ý trong một chú thích, chúng ta có thể đưa ra câu lệnh if hoàn toàn như vậy:

BigInteger val = new BigInteger("1254789363254125"); 
public boolean odd(BigInteger val) { 
    return !val.mod(new BigInteger("2")).equals(BigInteger.ZERO)); 
} 
+0

Nếu val% 2 == 0 số chẵn của nó, không phải là số lẻ. –

+0

Cảm ơn, quên dấu chấm than. – jrad

+0

Không cần câu lệnh if, chỉ cần 'return! Val.mod (new BigInteger (" 2 ")). Bằng (BigInteger.ZERO);'. –

1

Sử dụng val.mod (2).

BigInteger là một đối tượng. Bạn không thể sử dụng toán tử số học trên các đối tượng, chỉ hoạt động với các nguyên thủy.

% chỉ hoạt động với java.lang.Integer bởi vì điều đó được ẩn hoàn toàn (trên thực tế, nó được gọi là unboxed) thành int. Nhưng BigInteger không thể được unboxed. unboxing/baxing (có nghĩa là đối tượng nguyên thủy/nguyên thủy để chuyển đổi đối tượng) chỉ hoạt động với int, float, double, short và byte.

1

Như BigInteger là một lớp học và không phải là một nguyên thủy * 1, bạn không sử dụng toán tử với nó. Kiểm tra các phương pháp BigInteger: http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html#mod(java.math.BigInteger)

* 1: Trong trường hợp của Integer, Float, bạn có thể sử dụng các toán vì JVM tự động chuyển đổi các đối tượng với giá trị nguyên thủy của nó (autoboxing)

2

Một hiệu quả nhiều hơn nữa cách là kiểm tra bit cuối cùng. Nếu đó là 0 (còn gọi là false), số này là số chẵn, nếu không thì số đó là số lẻ.

public boolean odd(BigInteger i){ 
    return i.testBit(0); 
} 

odd(BigInteger.valueOf(1));//true 
odd(BigInteger.valueOf(2));//false 
odd(BigInteger.valueOf(101));//true 
odd(BigInteger.valueOf(100));//false 

Cũng có ít dòng mã hơn.

2

Tôi muốn sử dụng phương pháp remainder của lớp BigInteger theo cách này:

BigInteger result = a.remainder(b); 

Việc chuyển nhượng là do thực tế rằng BigInteger là không thay đổi, do đó, một sẽ không được thay đổi bằng phương pháp này.