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

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

Stavo lavorando al numero 8 per il progetto euler, dove la lunghezza del numero dovrebbe essere 1000, ma ogni volta che eseguo questo programma, ricevo 416. Qualcuno potrebbe spiegarmi perché questo non funziona?Perché il mio array di byte mostra una lunghezza errata?

+1

Perché la rappresentazione testuale di un numero non ha assolutamente nulla a che fare con il valore binario. –

risposta

6

uno char non significa uno bytequi, ad esempio numero 11 è 00001011 che può essere rappresentato da solo 1 byte

Analogamente nel caso

7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 

è in binario

1011001000110011100000101111011000010111001000110011110000001000000000010100100101011100100110100100001010111010001101011100100100011110110101101111001100110111101110101000011011011101011001010111001000000101110101100000100100010011010111010111100010100110000101010101101100000110100111000111001001011111001001010110110110111011010111100010111101001011010110111000110111111011011000110110110110110001110100001011010001101110110010011100010010000000011011100101110101100011110010010010110110001111101111101100010011000110001000111111001010111110001000111010000010000011110000111101011010011010100001011110001010000001001000101111110000110000011111110000010110100010110101100111011000000001100011100111000000000100100101110101000100010001010100101111001100110011000110001110101010100001010101011000111011010110010000101010100110010110111100011100011000001001011100111000001001101111111001101111011000111011110101101010001001000110100110010011110101001101110110000000010011100101011111110110101001101000011011111110001011001110111010010001110000010100111010001011101011111000111001000011010111111001000101010001101100001000111111011001010010101100000001001100111100011001010111111010011111100100101011011010000010100100101110000010101000110010011010001001100011101101111110001000001000011101011111111011010100010010101011111011101000010111011001000000001100011111101100111011001111111100100001100110111110110110000101101000101110101111000101101111010010101000000001110100111011001000011001100010001110001000010110110011000111001000110010100110111000010110110100110010100101111111000100101011001100111100111001011100000000100110110000110001001001111011110101100101010010010000111110101011111101010101101011001001010000011000110010010111101001000110001011111001111011101010111010110111111110101011010011011101000011010010110010110101001100100010110000000110101001100101010110110011000101011000111100011000100110010011101111011111111100101110000011111110000110010001100011111101011100110001001001010100101001100011110110110000101001111010101001011101000101011011011000010010000001000110001000100101000000110010000100101000101001101111010010011101010001110011001110000001011011001111100100110010101101011000101001111110011101101010001111000111101101110111001001111101001010000011001101000111110100000000100011101000101111101001111100101111101010000100011101100000110010010001001110010100101010101101000100111000001110100010011110110000100001111001001001010111101001111001100010101000110000101111100101110001110001000011001010001000001101111100010110001000111111010101110110100100111011100100010000011111100001100011001011110010111111100011111010010100100000111100110101011000010100011100100001000101011101110000011101010110100111101101110000110010011110101110110100011001101110111101010110100000010001011111110011000010111111111101101110011110010100101011100100111101000110100001011011011010101111100001101111010110011110111000000010101101000111000100101101010110010110110010100001000000110000110011100011000111101011010110011010000100000111000101101100111111101111110100110010010011001011001010110001110111011100110101010101011000110100100001000011101111011100111010001101101011111011111001010110111011101110000001110010011001101010000010110001100101101111011111011111000100010100001000011001100010101100010100100101011101111010 

Ora, se si check how many byte it requires to represent this number


Più in generale si può controllare questo

N lunghezza della stringa binaria può rappresentare fino a 2^N - 1 numero

Per la lunghezza: 2 = (binario max stringa) 11 = 2^2 - 1 = 3 (in 10)

+0

C'è un modo per cambiarlo in un array intero? – idude

+1

'toString(). ToCharacterArray()' e converte ciascun carattere in 'int' –

+1

@JigarJoshi +1 per l'esempio e le prove. La ragione per cui stampa '415' invece di' 416' è dovuta alla divisione intera FYI. – Obicere

1

Non so esattamente come B igInteger memorizza i valori, ma la mia ipotesi sarebbe quella invece di memorizzarli come una stringa, con un byte per cifra, li memorizza come un numero lungo, con i bit log_2 (n) usati per memorizzare il numero n, e quindi il soffitto (log_2 (n)/8) byte in uso.

3

Questo perché toByteArray salva la rappresentazione binaria del numero, non un decimale. Puoi pensare a ciascun byte che rappresenta una singola cifra in base-256. Ecco perché lo spazio richiesto per la rappresentazione è più del doppio del numero di cifre decimali.

Se è necessario salvare ogni cifra a un byte, convertire il BigInteger-String: la sua lunghezza sta per essere uguale al numero di cifre (più un carattere per il carattere meno '-' se il numero è negativo).

1

Poiché un array di byte è un numero in base 256 (poiché ogni cifra può avere intervallo 0-255 o 0x00-0xFF) mentre il numero di ingresso è in base 10. Quando si converte il numero in un array di byte si ottiene un numero che si trova in una base diversa, quindi ha una diversa quantità di cifre.

per dimostrarlo si può applicare la modifica della base dei logaritmi:

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 
Problemi correlati