কম্পিউটার টিউটোরিয়াল

C++ দিয়ে কমপক্ষে একটি নন-এম্পটি সাব-অ্যারের বিটওয়াইজ AND হবে এমন সংখ্যাগুলো বের করা

একটি সমস্যা সমাধান করতে হবে যেখানে একটি অ্যারে দেওয়া আছে, এবং আমাদের সব সম্ভাব্য পূর্ণসংখ্যা বের করতে হবে যেগুলো কমপক্ষে একটি খালি নন (non-empty) সাব-অ্যারে (subarray) এর বিটওয়াইজ AND (bitwise AND) হতে পারে। উদাহরণ −

ইনপুট: nums[] = { 3, 5, 1, 2, 8 } আউটপুট: { 2, 5, 0, 3, 8, 1 } ব্যাখ্যা: 2 হলো {2} সাবঅ্যারের AND, 5 হলো {5}-এর AND, 0 হলো {1, 2}, {2, 8}, {1, 2, 8}-এর AND, 3 হলো {3}-এর AND, 8 হলো {8}-এর AND, 1 হলো {1}, {3, 5}, {3, 5, 1}-এর AND।
ইনপুট: nums[] = { 2, 6, 3, 8, 1 } আউটপুট: { 1, 8, 3, 6, 2, 0 }
সমাধানের পদ্ধতি

একটি সহজ পদ্ধতি (Simple Approach) হলো −

  • সব সম্ভাব্য নন-এম্পটি সাবঅ্যারে বের করা।

  • অ্যারে ট্রাভার্স করার সময় প্রতিটি সাবঅ্যারের এলিমেন্টের বিটওয়াইজ AND গণনা করা।

  • ডুপ্লিকেট (duplicate) ভ্যালু এড়াতে সব ফলাফল সেট (set) এ রাখা।

উদাহরণ
 #include <bits/stdc++.h> using namespace std; int main(){     int arr[] = { 2, 6, 3, 8, 1 };     int n = sizeof(arr) / sizeof(arr[0]);     // প্রতিটি AND অপারেশনের ফলাফল রাখার সেট     unordered_set<int> result;     int val;     // নেস্টেড লুপ: সব সম্ভাব্য নন-এম্পটি সাবঅ্যারে ট্রাভার্স     for (int i = 0; i < n; ++i){         for (int j = i, val = INT_MAX; j < n; ++j){             val = val & arr[j];             result.insert(val); // AND ফলাফল সেটে রাখা         }     }     cout << "All possible numbers are: ";     // সেটের সব ভ্যালু প্রিন্ট     for (auto i = result.begin(); i != result.end(); i++)         cout << *i << " ";     return 0; }
আউটপুট
All possible numbers are: 1 8 3 6 0 2
কোডের ব্যাখ্যা
  • AND অপারেশনের সব ফলাফল রাখার জন্য সেট ডিক্লেয়ার।

  • 'val' ভেরিয়েবল INT_MAX দিয়ে ইনিশিয়ালাইজ কারণ সব বিট ১ থাকা অবস্থায় AND শুরু করতে হবে।

  • ইননার লুপ: i-তম ইনডেক্স থেকে সব সম্ভাব্য সাবঅ্যারে।

  • প্রতিটি এলিমেন্টের সাথে AND অপারেশন করে রেজাল্ট সেটে রাখা।

  • রেজাল্ট সেটের সব ভ্যালু প্রিন্ট।

উপসংহার

এই টিউটোরিয়ালে আমরা এই সমস্যা সমাধানের একটি সহজ পদ্ধতি আলোচনা করেছি: প্রতিটি সম্ভাব্য সাবঅ্যারেতে AND অপারেশন গণনা করা। এই সমস্যা সমাধানের C++ প্রোগ্রামও দেওয়া আছে। আপনি এই কোড Java, C, Python ইত্যাদি ভাষায়ও লিখতে পারেন। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।

  1. সি++ প্রোগ্রাম: এমন সংখ্যাগুলো প্রিন্ট করা যাতে কোনো দুটি ক্রমাগত সংখ্যা কো-প্রাইম (Co-prime) নয় কিন্তু প্রতিটি তিনটি ক্রমাগত সংখ্যা কো-প্রাইম

  2. C++-এ ডিভাইড অ্যান্ড কঙ্কর ব্যবহার করে मैक्सিমাম সাবঅ্যারে সম বের করা

  3. যোগফল এবং GCD দিয়ে দুটি সংখ্যা বের করা (C++)

  4. C++-এ ডিভাইড এন্ড কংকর অ্যালগরিদম দিয়ে সর্বোচ্চ সাবঅ্যারে সম