2014-11-19 6 views
6

मुझे एक संयोजन की एक बूलियन सरणी बनाने में सक्षम होना चाहिए और यह देखने के लिए प्रोग्राम के माध्यम से इसे चलाने की आवश्यकता है कि यह काम करता है या नहीं। यदि नहीं तो मैं इसका निपटान करता हूं और अगले संयोजन पर जाता हूं। मेरी समस्या यह है कि मुझे नहीं पता कि इस सरणी को कैसे बनाया जाए क्योंकि एन 1-1000 से कहीं भी बराबर हो सकता है। तो मैं Integer.toBinaryString का उपयोग करने की योजना बना रहा था, लेकिन यह 32 से अधिक होने पर बहुत बड़ा होने के कारण काम नहीं करेगा। कोई भी मदद शानदार होगी।आकार एन के बूलियन सरणी के सभी संभावित तरीकों का निर्माण करना?

धन्यवाद!

+0

एन क्या होगा? सरणी की लंबाई? – yts

+0

कुछ 'लूप' के लिए? – zapl

+0

क्षमा करें मेरी बुरा, एन बूलियन सरणी – Fischerk12

उत्तर

2

"स्वीकार किए जाते हैं जवाब" कहा गया है कि

परीक्षण किया गया है और इस तरह के रूप में 10000 और इतने पर n के उच्च मूल्यों, के लिए काम करेंगे।

लेकिन यह गलत है।

public static void main(String[] args) { 
    final int n = 3; 
    for (int i = 0; i < Math.pow(2, n); i++) { 
     String bin = Integer.toBinaryString(i); 
     while (bin.length() < n) 
      bin = "0" + bin; 
     char[] chars = bin.toCharArray(); 
     boolean[] boolArray = new boolean[n]; 
     for (int j = 0; j < chars.length; j++) { 
      boolArray[j] = chars[j] == '0' ? true : false; 
     } 
     System.out.println(Arrays.toString(boolArray)); 
    } 
} 

जब n > 31 यह होगा पाश हमेशा के लिए के बाद से i होगा अतिप्रवाह पहले 2^31 संयोजनों दोहरा और Math.pow(2, n) तक पहुँचने कभी नहीं होगा। आप आसानी से अनिश्चित काल के लिए i exceeded Integer.MAX_VALUE हालांकि यह आसानी से BigInteger या पाशन के लिए एक समान डेटा संरचना का उपयोग कर ठीक किया जा सकता प्रिंट होगा ऊपर

public static void main2(String[] args){ 
     int n = 32; 
     for (int i = 0; i < Math.pow(2, n); i++){ 
      if (i == Integer.MIN_VALUE) { 
       // i overflows 
       System.out.println("i exceeded Integer.MAX_VALUE"); 
      } 
     } 
    } 

कोड के साथ इस परीक्षण कर सकते हैं। नीचे दिया गया कोड n <= Integer.MAX_VALUE

public static void main(String[] args) { 
    final int n = 32; 
    BigInteger bi = BigInteger.ZERO; 
    BigDecimal rows = new BigDecimal(Math.pow(2, n)); 
    while (bi.compareTo(rows.toBigInteger()) < 0) { 
     String bin = bi.toString(2);//Integer.toBinaryString(i); 
     while (bin.length() < n) 
      bin = "0" + bin; 
     char[] chars = bin.toCharArray(); 
     boolean[] boolArray = new boolean[n]; 
     for (int j = 0; j < chars.length; j++) { 
      boolArray[j] = chars[j] == '0' ? true : false; 
     } 
     System.out.println(Arrays.toString(boolArray)); 
     bi = bi.add(BigInteger.ONE); 
    } 
} 
3

मैं एक SO question पर अपनी समस्या का जवाब मिल गया है, और मैं आप के लिए यह अनुकूल नहीं बनाया है:

public class Foo { 
    public static void main(String[] args) { 
     final int n = 3; 
     for (int i = 0; i < Math.pow(2, n); i++) { 
      String bin = Integer.toBinaryString(i); 
      while (bin.length() < n) 
       bin = "0" + bin; 
      char[] chars = bin.toCharArray(); 
      boolean[] boolArray = new boolean[n]; 
      for (int j = 0; j < chars.length; j++) { 
       boolArray[j] = chars[j] == '0' ? true : false; 
      } 
      System.out.println(Arrays.toString(boolArray)); 
     } 
    } 
} 

उत्पादन होगा:

[true, true, true] 
[true, true, false] 
[true, false, true] 
[true, false, false] 
[false, true, true] 
[false, true, false] 
[false, false, true] 
[false, false, false] 

परीक्षण किया गया है और इस उच्च के लिए काम करेंगे n के मूल्य, जैसे 10000 और इसी तरह के।

+0

देखें मैंने देखा कि यह समस्याएं नहीं पैदा करेगा क्योंकि मुझे सरणी में 1000 अलग-अलग स्थानों पर जाना है, इसलिए मुझे 1000 बाइट्स के साथ कुछ चाहिए। – Fischerk12

+0

हाँ, मेरा बुरा। जब मैं 'n' के लिए उच्च संख्या का प्रयास करता हूं तो मुझे वास्तव में 'आउटऑफमेमरी एरर' मिल रहा है। उस स्थिति में, आपको बस [^] के आकार के साथ 2^एन सरणी बनाना होगा। मैंने अपना जवाब अपडेट कर लिया है। – victorantunes

+0

'के लिए (int i = 0; i 31' हमेशा के लिए लूप होगा क्योंकि पूर्णांक' i' 'assertTrue (Integer.MAX_VALUE + 1 = = Integer.MIN_VALUE) 'सुधारित कार्यान्वयन के लिए मेरा उत्तर देखें – SGal

संबंधित मुद्दे