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

C++ বাইনারি নাম্বার থেকে এক বিট রিমুভ করে সর্বোচ্চ মান পান


একটি সমস্যা আলোচনা করব যেখানে আমাদের একটি বাইনারি নম্বর দেওয়া আছে। আমাদের সেটি থেকে একটি বিট রিমুভ করতে হবে যাতে বাকি নাম্বারটি অন্য সব অপশন থেকে সর্বোচ্চ হয়। উদাহরণস্বরূপ:

Input : N = 1011 Output: 111 Explanation: এক বিট রিমুভ করতে হবে, ০ বিট রিমুভ করলে অন্য ১ বিট রিমুভ করার চেয়ে বড় সংখ্যা পাওয়া যায়। 111 > 101, 011। Input: 111 Output: 11 Explanation: যেহেতু সব বিট ১, তাই যেকোনো বিট রিমুভ করা যাবে।

সমাধানের পদ্ধতি

ব্রুট-ফোর্স মেথড

ব্রুট ফোর্স প্রয়োগ করলে সর্বোচ্চ ফলাফল 주는 নাম্বার मिलবে, অর্থাৎ প্রতিটি বিট এক এক করে রিমুভ করে, বিভিন্ন ফলাফল তুলনা করে, এবং সর্বোচ্চ ফলাফল পাওয়া যাবে।

কিন্তু একটি দক্ষ পদ্ধতি আছে যা ব্যবহার করা যায়, অর্থাৎ যদি আমরা সবচেয়ে কম গুরুত্বপূর্ণ বিটটি রিমুভ করি।

দক্ষ পদ্ধতি

দক্ষ পদ্ধতিটি ফলাফলের ওপর সবচেয়ে কম প্রভাব ফেলে।

  • প্রথমে ডান দিক থেকে বিটগুলো ট্রাভার্স করুন।

  • ০ খুঁজে বের করুন এবং প্রথম বারের মতো সেটি রিমুভ করুন।

  • যদি ০ না পাওয়া যায়, তবে যেকোনো বিট রিমুভ করুন।

উদাহরণ

দক্ষ পদ্ধতির জন্য C++ কোড

 #include <bits/stdc++.h> using namespace std; int main(){     string str = "1011";     bool flag = false;     int n = str.length();     // ফলাফল সংরক্ষণের জন্য নতুন অ্যারে     char res[n - 1];     int j = 0;     // বাইনারি নাম্বার ডান দিক থেকে ট্রাভার্স করুন।     for (int i = 0; j < n - 1; i++) {         // যদি ০ পাওয়া যায় তবে সেটি স্কিপ করুন।         if (str[i] == '0' && flag == false) {             flag = true;             continue;         }         else             res[j++] = str[i];     }     // ফলাফল স্ট্রিং প্রিন্ট করুন।     cout << "Maximum number: " << res;     return 0; }

আউটপুট

Maximum number: 111

উপরোক্ত কোডের ব্যাখ্যা

  • একটি ফ্ল্যাগ (flag) ভেরিয়েবল ব্যবহার করা হয়েছে যাতে শুধু একটি ০ এলিমিনেট হয়।

  • ফলাফল সংরক্ষণের জন্য ক্যারেক্টার অ্যারে res ইনিশিয়ালাইজ করা হয়েছে।

  • লুপ n-1 পর্যন্ত চলে কারণ আসল নাম্বারের চেয়ে এক কম এলিমেন্ট সংরক্ষণ করতে হবে।

উপসংহার

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


  1. C++-এ একটি রেঞ্জ [L, R] থেকে দুটি পূর্ণসংখ্যার সর্বোচ্চ XOR মান (Maximum XOR Value of a Pair from a Range)

  2. C++-এ সংখ্যায় k ব্রেকপয়েন্ট বসিয়ে সর্বোচ্চ সেগমেন্ট ভ্যালু

  3. বাইনারি স্ট্রিং থেকে 010 সাবস্ট্রিং মুছে ফেলার ন্যূনতম ধাপ C++-তে

  4. সি++ প্রোগ্রাম: সংখ্যার সবচেয়ে významপূর্ণ সেট বিট (MSB) নির্ণয়