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

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

Pracowałem nad numerem 8 dla eulera projektu, gdzie długość numeru ma wynosić 1000, ale za każdym razem, gdy uruchamiam ten program, otrzymuję 416. Czy ktoś mógłby mi wyjaśnić, dlaczego to nie działa?Dlaczego tablica bajtów wyświetla nieprawidłową długość?

+1

Ponieważ reprezentacja tekstowa wielu nie ma absolutnie nic wspólnego z wartością binarną. –

Odpowiedz

6

jeden char nie znaczy jeden bytetutaj, np liczba 11 jest 00001011 które mogą być reprezentowane przez zaledwie 1 byte

Podobnie w przypadku

7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 

jest w formacie binarnym

1011001000110011100000101111011000010111001000110011110000001000000000010100100101011100100110100100001010111010001101011100100100011110110101101111001100110111101110101000011011011101011001010111001000000101110101100000100100010011010111010111100010100110000101010101101100000110100111000111001001011111001001010110110110111011010111100010111101001011010110111000110111111011011000110110110110110001110100001011010001101110110010011100010010000000011011100101110101100011110010010010110110001111101111101100010011000110001000111111001010111110001000111010000010000011110000111101011010011010100001011110001010000001001000101111110000110000011111110000010110100010110101100111011000000001100011100111000000000100100101110101000100010001010100101111001100110011000110001110101010100001010101011000111011010110010000101010100110010110111100011100011000001001011100111000001001101111111001101111011000111011110101101010001001000110100110010011110101001101110110000000010011100101011111110110101001101000011011111110001011001110111010010001110000010100111010001011101011111000111001000011010111111001000101010001101100001000111111011001010010101100000001001100111100011001010111111010011111100100101011011010000010100100101110000010101000110010011010001001100011101101111110001000001000011101011111111011010100010010101011111011101000010111011001000000001100011111101100111011001111111100100001100110111110110110000101101000101110101111000101101111010010101000000001110100111011001000011001100010001110001000010110110011000111001000110010100110111000010110110100110010100101111111000100101011001100111100111001011100000000100110110000110001001001111011110101100101010010010000111110101011111101010101101011001001010000011000110010010111101001000110001011111001111011101010111010110111111110101011010011011101000011010010110010110101001100100010110000000110101001100101010110110011000101011000111100011000100110010011101111011111111100101110000011111110000110010001100011111101011100110001001001010100101001100011110110110000101001111010101001011101000101011011011000010010000001000110001000100101000000110010000100101000101001101111010010011101010001110011001110000001011011001111100100110010101101011000101001111110011101101010001111000111101101110111001001111101001010000011001101000111110100000000100011101000101111101001111100101111101010000100011101100000110010010001001110010100101010101101000100111000001110100010011110110000100001111001001001010111101001111001100010101000110000101111100101110001110001000011001010001000001101111100010110001000111111010101110110100100111011100100010000011111100001100011001011110010111111100011111010010100100000111100110101011000010100011100100001000101011101110000011101010110100111101101110000110010011110101110110100011001101110111101010110100000010001011111110011000010111111111101101110011110010100101011100100111101000110100001011011011010101111100001101111010110011110111000000010101101000111000100101101010110010110110010100001000000110000110011100011000111101011010110011010000100000111000101101100111111101111110100110010010011001011001010110001110111011100110101010101011000110100100001000011101111011100111010001101101011111011111001010110111011101110000001110010011001101010000010110001100101101111011111011111000100010100001000011001100010101100010100100101011101111010 

Teraz, jeśli check how many byte it requires to represent this number


Bardziej ogólnie można to sprawdzić przez

N długości łańcucha binarnego może reprezentować maksymalnie 2^N - 1 liczby

Dla długości: 2 = (max binarnym string) 11 = 2^2 - 1 = 3 (w 10)

+0

Czy jest jakiś sposób zmienić go w tablicę całkowitą? – idude

+1

'toString(). ToCharacterArray()' i przekonwertować każdy znak 'int' –

+1

@JigarJoshi +1 dla przykładu i dowodów. Powód, dla którego drukuje "415" zamiast "416", jest spowodowany całkowitym podziałem FYI. – Obicere

1

ja nie wiem dokładnie jak B igInteger przechowuje wartości, ale moje przypuszczenie byłoby, że raczej niż przechowywanie ich w postaci ciągu znaków, z jednym bajcie na cyfrze, przechowuje je jako jeden długi numer, z log_2 (n) bitów jest używany do przechowywania liczb n, a zatem sufit (log_2 (n)/8) używane bajty.

3

To dlatego, że toByteArray zapisuje binarną reprezentację liczby, a nie jednego miejsca po przecinku. Możesz myśleć o każdym bajcie reprezentującym pojedynczą cyfrę w bazie-256. Dlatego ilość miejsca potrzebna do przedstawienia jest ponad dwukrotnie mniejsza niż liczba cyfr dziesiętnych.

Jeśli trzeba zapisać każdą cyfrę do bajta, konwertowanie BigInteger do String: jego długość będzie równa liczbie cyfr (plus jeden znak za znakiem minus '-' jeśli liczba jest ujemna).

1

Ponieważ tablica bajtów to liczba w bazie 256 (ponieważ każda cyfra może mieć zakres 0-255 lub 0x00-0xFF), podczas gdy numer wejściowy jest w bazie 10. Po przekształceniu liczby w tablicę bajtów uzyskuje się numer, który znajduje się w innej bazie, a więc ma inną liczbę cyfr.

Aby udowodnić to można zastosować zmianę podstawy logarytmów:

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 
Powiązane problemy