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

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

मैं प्रोजेक्ट यूलर के लिए नंबर 8 पर काम कर रहा था, जहां संख्या की लंबाई 1000 होनी चाहिए, लेकिन जब भी मैं इस कार्यक्रम को चलाता हूं, मुझे 416 मिलते हैं। क्या कोई मुझे बता सकता है कि यह क्यों काम नहीं कर रहा है?मेरी बाइट सरणी गलत लंबाई क्यों प्रदर्शित कर रही है?

+1

। –

उत्तर

6

एक char एक byte यहाँ उदाहरण के लिए , मतलब यह नहीं है संख्या 1100001011 जो आपके मामले में सिर्फ 1 byte

इसी प्रकार द्वारा दर्शाया जा सकता

7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 

बाइनरी में है

1011001000110011100000101111011000010111001000110011110000001000000000010100100101011100100110100100001010111010001101011100100100011110110101101111001100110111101110101000011011011101011001010111001000000101110101100000100100010011010111010111100010100110000101010101101100000110100111000111001001011111001001010110110110111011010111100010111101001011010110111000110111111011011000110110110110110001110100001011010001101110110010011100010010000000011011100101110101100011110010010010110110001111101111101100010011000110001000111111001010111110001000111010000010000011110000111101011010011010100001011110001010000001001000101111110000110000011111110000010110100010110101100111011000000001100011100111000000000100100101110101000100010001010100101111001100110011000110001110101010100001010101011000111011010110010000101010100110010110111100011100011000001001011100111000001001101111111001101111011000111011110101101010001001000110100110010011110101001101110110000000010011100101011111110110101001101000011011111110001011001110111010010001110000010100111010001011101011111000111001000011010111111001000101010001101100001000111111011001010010101100000001001100111100011001010111111010011111100100101011011010000010100100101110000010101000110010011010001001100011101101111110001000001000011101011111111011010100010010101011111011101000010111011001000000001100011111101100111011001111111100100001100110111110110110000101101000101110101111000101101111010010101000000001110100111011001000011001100010001110001000010110110011000111001000110010100110111000010110110100110010100101111111000100101011001100111100111001011100000000100110110000110001001001111011110101100101010010010000111110101011111101010101101011001001010000011000110010010111101001000110001011111001111011101010111010110111111110101011010011011101000011010010110010110101001100100010110000000110101001100101010110110011000101011000111100011000100110010011101111011111111100101110000011111110000110010001100011111101011100110001001001010100101001100011110110110000101001111010101001011101000101011011011000010010000001000110001000100101000000110010000100101000101001101111010010011101010001110011001110000001011011001111100100110010101101011000101001111110011101101010001111000111101101110111001001111101001010000011001101000111110100000000100011101000101111101001111100101111101010000100011101100000110010010001001110010100101010101101000100111000001110100010011110110000100001111001001001010111101001111001100010101000110000101111100101110001110001000011001010001000001101111100010110001000111111010101110110100100111011100100010000011111100001100011001011110010111111100011111010010100100000111100110101011000010100011100100001000101011101110000011101010110100111101101110000110010011110101110110100011001101110111101010110100000010001011111110011000010111111111101101110011110010100101011100100111101000110100001011011011010101111100001101111010110011110111000000010101101000111000100101101010110010110110010100001000000110000110011100011000111101011010110011010000100000111000101101100111111101111110100110010010011001011001010110001110111011100110101010101011000110100100001000011101111011100111010001101101011111011111001010110111011101110000001110010011001101010000010110001100101101111011111011111000100010100001000011001100010101100010100100101011101111010 

अब आप check how many byte it requires to represent this number


अधिक आम तौर पर आप से बाइनरी स्ट्रिंग की

N लंबाई इस जाँच कर सकते हैं अप 2^N - 1 संख्या के लिए प्रतिनिधित्व कर सकते हैं

लंबाई के लिए: 2 = (अधिकतम बाइनरी स्ट्रिंग) 11 = 2^2 - 1 = 3 (10 में)

+0

क्या कोई तरीका है कि मैं इसे एक पूर्णांक सरणी में बदल सकता हूं? – idude

+1

'toString()। ToCharacterArray()' और प्रत्येक अक्षर को 'int' –

+1

@JigarJoshi +1 को उदाहरण और सबूत के लिए रूपांतरित करें। '416' के बजाय' 415' प्रिंट करने के पीछे इसका कारण पूर्णांक विभाजन FYI के कारण है। – Obicere

1

मुझे नहीं पता कि कैसे बी igInteger मूल्यों को स्टोर करता है, लेकिन मेरा अनुमान यह होगा कि उन्हें एक बाइट प्रति अंक के साथ स्ट्रिंग के रूप में संग्रहीत करने के बजाय, यह उन्हें एक लंबी संख्या के रूप में संग्रहीत करता है, जिसमें log_2 (n) बिट्स को संख्या n को संग्रहीत करने के लिए उपयोग किया जा रहा है, और इसलिए छत (लॉग_2 (एन)/8) बाइट्स का इस्तेमाल किया जा रहा है।

3

ऐसा इसलिए है क्योंकि toByteArray संख्या का द्विआधारी प्रतिनिधित्व सहेजता है, न कि दशमलव। आप प्रत्येक बाइट बेस -256 में एक अंक का प्रतिनिधित्व करने के बारे में सोच सकते हैं। यही कारण है कि प्रतिनिधित्व के लिए आवश्यक स्थान दशमलव अंकों की संख्या से दो गुना कम है।

आप एक बाइट के लिए प्रत्येक अंक को बचाने के लिए, कन्वर्ट अपने BigIntegerString करने की जरूरत है: इसकी लंबाई अंक (प्लस माइनस चरित्र '-' यदि संख्या ऋणात्मक है के लिए एक चरित्र) की संख्या के बराबर हो रहा है।

1

क्योंकि बाइट सरणी आधार 256 में एक संख्या है (क्योंकि प्रत्येक अंक में 0-255 या 0x00-0xFF हो सकता है) जबकि इनपुट नंबर आधार 10 में है। जब आप अपना नंबर बाइट सरणी में परिवर्तित करते हैं तो आपको एक प्राप्त होता है संख्या जो एक अलग आधार पर है, इसलिए अंकों की एक अलग राशि है।

यह साबित करने के लिए आप लघुगणक के आधार की परिवर्तन लागू कर सकते हैं: क्योंकि एक नंबर के शाब्दिक प्रतिनिधित्व बिल्कुल कुछ भी नहीं बाइनरी मान के साथ क्या करना है

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 
संबंधित मुद्दे