2012-04-07 37 views

Trả lời

18

Như bạn đã đề cập trong câu hỏi của mình, bạn nên sử dụng BigInteger.

Chúng có thể lớn tới mức bạn cần - cho đến khi bạn hết bộ nhớ.

+0

vấn đề là tôi phải tìm ra căn bậc hai của một số.Nhưng không có thư viện sẵn có nào để tìm ra số roo của một số nguyên lỗi. – Ashwin

+0

@Ashwin: Chờ một phút - nếu căn bậc hai không được đảm bảo là số thập phân, tại sao bạn không chỉ đơn giản là sử dụng một đôi? –

+0

@HovercraftFullOfEels: Như tôi đã nói, số của tôi vượt quá 64 bit, khi kích thước của double là 64 bit – Ashwin

2

bạn đang tìm kiếm lớp BigDecimal hoặc nếu bạn chỉ cần số nguyên, lớn hơn BigInteger. Độ chính xác tùy ý của nó, do đó kích thước thay đổi dựa trên số lượng lớn các số bạn nhập

3

Kích thước của BigInteger trong java là gì?

Đó là một chút khó khăn. Vấn đề là không có đặc điểm kỹ thuật rõ ràng về giới hạn trong javadocs.

  • Lớp học sử dụng int[] để thể hiện độ lớn. Điều này có nghĩa là nó có khả năng có thể đại diện cho số lên đến ((2^32)^(2^31 - 1).

  • API có phương thức trả về số dưới dạng mảng byte bổ sung của 2. Giới hạn cho số này là ((2^8)^(2^31 - 1).

  • API có phương thức khác trả về kích thước của số theo bit ... dưới dạng int. Điều này ngụ ý giới hạn là 2^(2^31 - 1) hoặc có thể là 2^(2^32).

Trên thực tế, những con số này đều rất lớn mà bạn sẽ lẽ chạy vào giới hạn không gian đống (hoặc giới hạn hiệu suất CPU) đầu tiên.


vấn đề là tôi phải tìm ra căn bậc hai của một số.

Bạn sẽ có thể tìm thấy thuật toán để tính căn bậc hai trong sách giáo khoa toán học đại học của mình (hoặc Wikipedia). Mã hóa nó phải là một nhiệm vụ đơn giản.

(tôi muốn chỉ cho bạn ở ví dụ mã, ngoại trừ việc này có mùi như "bài tập về nhà", và tôi không hoàn toàn tin tưởng vào mã mà tôi tìm thấy.)

Đừng quên rằng nhất số nguyên có một căn bậc hai không hợp lý ...

0

Để tìm căn bậc hai của BigInteger bạn phải thực hiện tìm kiếm trên google bằng câu trả lời "-StackOverflow" bị bỏ qua. https://www.google.com/search?q=java+extract+root+bignum&ie=utf-8&oe=utf-8#q=java+root+BigInteger+-stackoverflow.com+-stackexchange.com mang lại liên kết đầu tiên đến http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/ Đây là một thuật toán. Java được cho là "viết một lần, sử dụng ở mọi nơi". Vâng, một số người dùng SO tin rằng bạn phải phát minh lại bánh xe. Yêu cầu họ cho một mô-đun họ trả lời "mùi giống như một bài tập về nhà, tự mình làm". Và có, BigInteger là một nửa nướng. Nó không thể làm lôgarit hoặc rễ ra khỏi hộp. Nó rất chậm. Thuật toán được đưa ra dưới đây.

BigInteger sqrt(BigInteger n) { 
    BigInteger a = BigInteger.ONE; 
    BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString()); 
    while(b.compareTo(a) >= 0) { 
    BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString()); 
    if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE); 
    else a = mid.add(BigInteger.ONE); 
    } 
    return a.subtract(BigInteger.ONE); 
} 
Các vấn đề liên quan