ধরুন আমাদের একটি নন-নেতিবাচক পূর্ণসংখ্যা n আছে, এবং আমাদের এটির এনকোড করা ফর্মটি খুঁজে বের করতে হবে। এনকোডিং কৌশলটি নিম্নরূপ হবে -
| সংখ্যা | এনকোড করা নম্বর |
|---|---|
| 0 | "" |
| 1 | “0” |
| 2 | “1” |
| 3 | "00" |
| 4 | "01" |
| 5 | ”10” |
| 6 | "11" |
| 7 | "000" |
সুতরাং সংখ্যাটি যদি 23 হয়, তাহলে ফলাফল হবে 1000, যদি সংখ্যাটি 54 হয়, তাহলে তা হবে 10111
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- বিন নামে একটি পদ্ধতি তৈরি করুন, এটি n এবং k লাগবে, এই পদ্ধতিটি নীচের মত কাজ করবে
- res :=খালি স্ট্রিং
- যখন n> 0
- res :=res + n mod 2 এর অঙ্ক
- n :=n /2
- সংখ্যা রিভার্স করুন
- যখন x> রেজের দৈর্ঘ্য
- res :=res-এর সাথে 0-এর আগে লিখুন
- রিটার্ন রিটার্ন
- প্রকৃত পদ্ধতিটি নিম্নরূপ হবে -
- যদি n =0 হয়, তাহলে খালি স্ট্রিং ফেরত দিন, যদি n 1 হয়, "0" ফেরত দিন, অথবা n 2 হলে, "1" ফেরত দিন
- x :=লগ n বেস 2
- যদি 2 ^ (x + 1) – 1 =n, তাহলে
- উত্তর :=খালি স্ট্রিং
- x 1 দ্বারা বাড়ান
- যদি x 0 না হয়, তারপর ans :=ans এর সাথে 0 যোগ করুন এবং x কে 1 দ্বারা বাড়ান
- উত্তর ফেরত দিন
- রিটার্ন বিন (n – 2^x + 1, x)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string bin(int n, int x){
string result = "";
while(n>0){
result += (n%2) + '0';
n/=2;
}
reverse(result.begin(), result.end());
while(x>result.size())result = '0' + result;
return result;
}
string encode(int n) {
if(n == 0)return "";
if(n == 1)return "0";
if(n==2) return "1";
int x = log2(n);
if(((1<<(x+1)) - 1) == n){
string ans = "";
x++;
while(x--)ans+="0";
return ans;
}
return bin(n - (1<<x) + 1, x);
}
};
main(){
Solution ob;
cout << (ob.encode(23)) << endl;
cout << (ob.encode(56)) << endl;
} ইনপুট
23 54
আউটপুট
1000 11001