मान लीजिए कि हमारे पास संख्याओं की एक सरणी है जिसे अंक कहा जाता है। हमें यह जांचना होगा कि क्या अंकों का कोई उपसमुच्चय मौजूद है जिसका बिटवाइज़ AND दो की घात है या नहीं।
इसलिए, यदि इनपुट संख्या =[22, 25, 9] की तरह है, तो आउटपुट सत्य होगा, उपसमुच्चय {22, 9} के रूप में द्विआधारी रूप {101010, 1001} है और इन दोनों में से 10000 =16 है जो 2 की शक्ति है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- MAX :=32 यह देखते हुए कि अधिकतम 32 बिट संख्याएं हैं
- एक फ़ंक्शन को हल करें() परिभाषित करें। इसमें अंक लगेंगे
- यदि अंकों का आकार 1 है, तो
- सही लौटें जब अंक [0] 2 की शक्ति हो, अन्यथा गलत हो
- कुल :=0
- मैं के लिए 0 से MAX -1 की सीमा में, करो
- कुल :=कुल या 2^i
- मैं के लिए 0 से MAX -1 की सीमा में, करो
- रिट:=कुल
- जे के लिए 0 से लेकर अंकों के आकार तक, करें
- अगर nums[j] AND (2^i) शून्य नहीं है, तो
- ret:=ret और nums[j]
- अगर nums[j] AND (2^i) शून्य नहीं है, तो
- यदि रिट 2 की शक्ति है, तो
- सही लौटें
- झूठी वापसी
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
MAX = 32 def is_2s_pow(v): return v and (v & (v - 1)) == 0 def solve(nums): if len(nums) == 1: return is_2s_pow(nums[0]) total = 0 for i in range(0, MAX): total = total | (1 << i) for i in range(0, MAX): ret = total for j in range(0, len(nums)): if nums[j] & (1 << i): ret = ret & nums[j] if is_2s_pow(ret): return True return False nums = [22, 25, 9] print(solve(nums))
इनपुट
[22, 25, 9]
आउटपुट
True