2013-08-11 43 views
5
BigInteger number = new BigInteger("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"); 
byte[] array = number.toByteArray(); 

System.out.println((int)array.length); 

Tôi đang làm việc trên số 8 cho dự án euler, với độ dài số là 1000, nhưng bất cứ khi nào tôi chạy chương trình này, tôi nhận được 416. Ai đó có thể giải thích cho tôi tại sao điều này không hoạt động?Tại sao mảng byte của tôi hiển thị độ dài sai?

+1

Bởi vì đại diện văn bản của một số đã hoàn toàn không có gì để làm với các giá trị nhị phân. –

Trả lời

6

một char không có nghĩa là một byteđây, ví dụ số 1100001011 có thể được thể hiện bằng chỉ 1 byte

Tương tự như vậy trong trường hợp của bạn

7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 

là ở dạng nhị phân

1011001000110011100000101111011000010111001000110011110000001000000000010100100101011100100110100100001010111010001101011100100100011110110101101111001100110111101110101000011011011101011001010111001000000101110101100000100100010011010111010111100010100110000101010101101100000110100111000111001001011111001001010110110110111011010111100010111101001011010110111000110111111011011000110110110110110001110100001011010001101110110010011100010010000000011011100101110101100011110010010010110110001111101111101100010011000110001000111111001010111110001000111010000010000011110000111101011010011010100001011110001010000001001000101111110000110000011111110000010110100010110101100111011000000001100011100111000000000100100101110101000100010001010100101111001100110011000110001110101010100001010101011000111011010110010000101010100110010110111100011100011000001001011100111000001001101111111001101111011000111011110101101010001001000110100110010011110101001101110110000000010011100101011111110110101001101000011011111110001011001110111010010001110000010100111010001011101011111000111001000011010111111001000101010001101100001000111111011001010010101100000001001100111100011001010111111010011111100100101011011010000010100100101110000010101000110010011010001001100011101101111110001000001000011101011111111011010100010010101011111011101000010111011001000000001100011111101100111011001111111100100001100110111110110110000101101000101110101111000101101111010010101000000001110100111011001000011001100010001110001000010110110011000111001000110010100110111000010110110100110010100101111111000100101011001100111100111001011100000000100110110000110001001001111011110101100101010010010000111110101011111101010101101011001001010000011000110010010111101001000110001011111001111011101010111010110111111110101011010011011101000011010010110010110101001100100010110000000110101001100101010110110011000101011000111100011000100110010011101111011111111100101110000011111110000110010001100011111101011100110001001001010100101001100011110110110000101001111010101001011101000101011011011000010010000001000110001000100101000000110010000100101000101001101111010010011101010001110011001110000001011011001111100100110010101101011000101001111110011101101010001111000111101101110111001001111101001010000011001101000111110100000000100011101000101111101001111100101111101010000100011101100000110010010001001110010100101010101101000100111000001110100010011110110000100001111001001001010111101001111001100010101000110000101111100101110001110001000011001010001000001101111100010110001000111111010101110110100100111011100100010000011111100001100011001011110010111111100011111010010100100000111100110101011000010100011100100001000101011101110000011101010110100111101101110000110010011110101110110100011001101110111101010110100000010001011111110011000010111111111101101110011110010100101011100100111101000110100001011011011010101111100001101111010110011110111000000010101101000111000100101101010110010110110010100001000000110000110011100011000111101011010110011010000100000111000101101100111111101111110100110010010011001011001010110001110111011100110101010101011000110100100001000011101111011100111010001101101011111011111001010110111011101110000001110010011001101010000010110001100101101111011111011111000100010100001000011001100010101100010100100101011101111010 

Bây giờ nếu bạn check how many byte it requires to represent this number


More thường bạn có thể kiểm tra điều này bằng cách

N chiều dài của chuỗi nhị phân có thể biểu diễn lên đến 2^N - 1 số

Đối với chiều dài: 2 = (max nhị phân chuỗi) 11 = 2^2 - 1 = 3 (trong 10)

+0

Có cách nào tôi có thể thay đổi nó thành một mảng số nguyên không? – idude

+1

'toString(). ToCharacterArray()' và chuyển đổi từng ký tự thành 'int' –

+1

@JigarJoshi +1 cho ví dụ và bằng chứng. Lý do đằng sau nó in '415' thay vì' 416' là do phân chia số nguyên FYI. – Obicere

1

Tôi không biết chính xác cách B igInteger lưu trữ các giá trị, nhưng tôi đoán là thay vì lưu trữ chúng dưới dạng một chuỗi, với một byte cho mỗi chữ số, nó lưu trữ chúng dưới dạng một số dài, với bit log_2 (n) được sử dụng để lưu trữ số n và do đó trần (log_2 (n)/8) byte đang được sử dụng.

3

Điều này là do toByteArray lưu biểu diễn nhị phân của số, chứ không phải số thập phân. Bạn có thể nghĩ về từng byte đại diện cho một chữ số duy nhất trong cơ sở 256. Đó là lý do tại sao không gian cần thiết cho biểu diễn nhỏ hơn hai lần số chữ số thập phân.

Nếu bạn cần lưu từng chữ số vào một byte, hãy chuyển đổi BigInteger thành String: độ dài của nó bằng số chữ số (cộng với một ký tự cho ký tự trừ '-' nếu số âm).

1

Vì mảng byte là số trong cơ sở 256 (vì mỗi chữ số có thể có dải 0-255 hoặc 0x00-0xFF) trong khi số đầu vào nằm ở đáy 10. Khi bạn chuyển số của bạn thành mảng byte, bạn có được số trong một cơ sở khác nhau, do đó có số lượng chữ số khác nhau.

Để chứng minh điều đó bạn có thể áp dụng các thay đổi của cơ sở của logarit:

logA(C) = logB(C)/logB(A) 
log10(C) = log256(C)/log256(10) 
1000 ~= 416/log256(10) 
1000 ~= 416/(log2(10)/log2(256)) 
1000 ~= 416/(3.3219/8) 
1000 ~= 416/0.4152 
1000 * 0.4152 ~= 416 
415.2 ~= 416