এই সমস্যাতে, আমাদের একটি নম্বরের বাইনারি রিপ্রেজেন্টেশন দেওয়া আছে এবং আমাদের প্রিভিয়াস নম্বর অর্থাৎ দেয়া নম্বর থেকে ১ বিয়োগ করলে যা আসে তার বাইনারি রিপ্রেজেন্টেশন বের করতে হবে।
বাইনারি রিপ্রেজেন্টেশন হলো একটি নম্বরের বেস ২-এ কনভার্ট করে শুধু ০ বা ১ দিয়ে রিপ্রেজেন্ট করা।
উদাহরণস্বরূপ, ২৩-এর বাইনারি রিপ্রেজেন্টেশন 10111।
তবে, আমাদের একটি নম্বর n বাইনারি ফর্মে দেওয়া থাকবে। এবং আমাদের n-1-এর বাইনারি রিপ্রেজেন্টেশন বের করতে হবে।
এই সমস্যা সমাধান করতে হলে বাইনারি সাবট্র্যাকশনের বেসিক জানতে হবে। ০ বা ১ থেকে ১ বিয়োগ করলে বাইনারি-তে কী হয় তা দেখি: 0 - 1 = 1 + 1 ক্যারি নেক্সট বিট থেকে। 1 - 1 = 0।
উদাহরণ দিয়ে ভালোভাবে বুঝি:
ইনপুট: 101101100 আউটপুট: 101101011 ব্যাখ্যা: (101101100)₂ হলো ৩৬৪-এর বাইনারি রিপ্রেজেন্টেশন। এর প্রিভিয়াস নম্বর ৩৬৩ যার বাইনারি রিপ্রেজেন্টেশন (101101011)₂। আমরা বাইনারি সাবট্র্যাকশন ব্যবহার করেছি এবং নম্বরের বাইনারি রিপ্রেজেন্টেশন থেকে (1)₂ বিয়োগ করেছি।
এই প্রোগ্রামের লজিক এবং তারপর অ্যালগরিদম দেখি। এখানে আমাদের নম্বরের বাইনারি রিপ্রেজেন্টেশন থেকে ১ বিয়োগ করতে হবে। এজন্য আমরা ডান দিক থেকে শুরু করব এবং সব ০ কে ১ করে ফ্লিপ করব যতক্ষণ না ১ পাওয়া যায়। ১ পাওয়া গেলে সেটি ০ করে ফ্লিপ করে ফাইনাল রেজাল্ট রিটার্ন করব।
অ্যালগরিদম
ধাপ ১: ডান থেকে বাম শুরু করুন অর্থাৎ n-1 থেকে 0। ধাপ ২: ১ পাওয়া গেলে সেটি ০ করে ব্রেক করুন। ধাপ ৩: ০ পাওয়া গেলে সেটি ১ করুন। ধাপ ৪: অ্যারে প্রিন্ট করুন।
উদাহরণ
উপরের অ্যালগরিদমের প্রোগ্রাম বাস্তবায়ন:
#include <bits/stdc++.h>
using namespace std;
string previousNumber(string num) {
int n = num.size();
if (num.compare("1") == 0)
return "0";
int i;
for (i = n - 1; i >= 0; i--) {
if (num.at(i) == '1') {
num.at(i) = '0';
break;
} else
num.at(i) = '1';
}
if (i == 0)
return num.substr(1, n - 1);
return num;
}
int main() {
string number = "1011011000";
cout << "the Binary representation of the number is " << number << endl;
cout << "Binary representation of previous number is " << previousNumber(number);
return 0;
}
আউটপুট
The Binary representation of the number is 1011011000 Binary representation of previous number is 1011010111