ধরুন আমাদের একটি ধনাত্মক পূর্ণসংখ্যা n আছে। আমাদের n-এর চেয়ে কম বা সমান অ-ঋণাত্মক পূর্ণসংখ্যা খুঁজে বের করতে হবে। সীমাবদ্ধতা হল বাইনারি উপস্থাপনা ধারাবাহিকভাবে ধারণ করবে না। তাই যদি ইনপুট 7 হয়, তাহলে উত্তর হবে 5, কারণ 5-এর বাইনারি উপস্থাপনা হল 101৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন রূপান্তর() সংজ্ঞায়িত করুন, এটি n, নেবে
- ret :=খালি স্ট্রিং
- যখন n অ-শূন্য, কর −
- ret :=ret + (n mod 2)
- n :=ডান শিফট n, 1 বার
- রিটার্ন রিটার্ন
- প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
- বিটস :=ফাংশন রূপান্তর (সংখ্যা) কল করুন
- n :=বিটের আকার
- n আকারের একটি অ্যারে সংজ্ঞায়িত করুন, n আকারের একটি অ্যারের শূন্য সংজ্ঞায়িত করুন
- ones[0] :=1, zeroes[0] :=1
- আরম্ভ করার জন্য i :=1, যখন i
করুন - শূন্য[i] :=শূন্য[i - 1] + ones[i - 1]
- ones[i] :=শূন্য[i - 1]
- করুন
- যদি বিট[i] '0' এর মতো হয় এবং বিট[i + 1] '0' এর মতো হয়, তাহলে −
- ret :=ret - ones[i]
- অন্যথায় যখন বিট[i] '1'-এর মতো এবং বিট[i + 1] '1'-এর মতো, তখন −
- লুপ থেকে বেরিয়ে আসুন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: string convert(int n){ string ret = ""; while(n){ ret += (n % 2) + '0'; n >>= 1; } return ret; } int findIntegers(int num) { string bits = convert(num); int n = bits.size(); vector <int> ones(n); vector <int> zeroes(n); ones[0] = zeroes[0] = 1; for(int i = 1; i < n; i++){ zeroes[i] = zeroes[i - 1] + ones[i - 1]; ones[i] = zeroes[i - 1]; } int ret = ones[n - 1] + zeroes[n - 1]; for(int i = n - 2; i >= 0; i--){ if(bits[i] == '0' && bits[i + 1] == '0') ret -= ones[i]; else if(bits[i] == '1' && bits[i + 1]== '1') break; } return ret; } }; main(){ Solution ob; cout << (ob.findIntegers(7)); }
ইনপুট
7
আউটপুট
5