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

সংখ্যার বাইনারি রিপ্রেজেন্টেশনে নির্দিষ্ট দৈর্ঘ্যের ক্রমাগত ১ গুলো খুঁজে বের করা C++-তে


মনে করুন, আমাদের দুটি পূর্ণসংখ্যা x এবং n আছে। আমাদের কাজ হল প্রথম ক্রমাগত ১-গুলোর স্ট্রীম (৩২-বিট বাইনারি) খুঁজে বের করা যাদের দৈর্ঘ্য n-এর চেয়ে বড় বা সমান। এবং তার পজিশন রিটার্ন করা। যদি এমন কোনো স্ট্রিং না থাকে, তবে -1 রিটার্ন করুন। উদাহরণস্বরূপ, যদি x = 35, এবং n = 2 হয়, তবে ফলাফল হবে 31। ৩২-বিট ইন্টিজারে 35-এর বাইনারি রিপ্রেজেন্টেশন হল -

00000000000000000000000000100011। তাই দুটি ক্রমাগত ১ ইনডেক্স 31-এ উপস্থিত, তাই উত্তর 31।

এই সমস্যাটি সমাধানের জন্য, আমাদের লিডিং জিরোর সংখ্যা বের করতে হবে, এবং সেই কাউন্ট থেকে ক্রমাগত ১-গুলো খুঁজে বের করার চেষ্টা করব। ভালোভাবে বুঝতে উদাহরণটি দেখুন।

উদাহরণ

#include <iostream>
using namespace std;

int leadingZeroCount(int x) {
    unsigned y;
    int n;
    n = 32;
    for (int i = 16; i > 1; i = i / 2) {
        y = x >> i;
        if (y != 0) {
            n -= i;
            x = y;
        }
    }
    y = x >> 1;
    if (y != 0)
        return n - 2;
    return n - x;
}

int consecutiveOnePosition(unsigned x, int n) {
    int k, p;
    p = 0;
    while (x != 0) {
        k = leadingZeroCount(x);
        x = x << k;
        p = p + k;
        k = leadingZeroCount(~x);
        if (k >= n)
            return p + 1;
        x = x << k;
        p = p + k;
    }
    return -1;
}

int main() {
    int x = 35;
    int n = 2;
    cout << "Consecutive 1s of length " << n << " is starting from index: " << consecutiveOnePosition(x, n);
}

আউটপুট

Consecutive 1s of length 2 is starting from index: 31

  1. বাইনারি রিপ্রেজেন্টেশনে k-তম বিটের মান বের করা (C++)

  2. C++ একটি সংখ্যাকে অন্য সংখ্যার ঘাতে প্রকাশ করা

  3. C++ দিয়ে B বেসে N!-এর末尾 শূন্যের সংখ্যা বের করা

  4. C++ দিয়ে বেস ১৬-এ N!-এর শেষ শূন্যের সংখ্যা বের করা