समस्या विवरण
इस समस्या में, हमें एक संख्या N दी गई है। हमारा कार्य दिए गए पूर्णांक मान N के लिए पहले तीन और अंतिम तीन बिट्स के दशमलव रूपांतरण को खोजना है।
उदाहरण
इनपुट: 57 आउटपुट: 7 1
हल का दृष्टिकोण
एक सरल समाधान संख्या n को उसके बाइनरी समकक्ष में बदलना है और फिर बिट्स को एक सरणी में सहेजना है। इसके बाद, हम सरणी से पहले तीन और अंतिम तीन मानों को व्यक्तिगत रूप से संख्याओं में बदलेंगे। बिट्स के दोनों सेट का दशमलव रूपांतरण हमारा परिणाम है।
उदाहरण के लिए, संख्या 80 लें।
80 का बाइनरी रूपांतरण 1010000 है।
पहले तीन बिट्स (101) का दशमलव रूपांतरण 5 है।
अंतिम तीन बिट्स (000) का दशमलव समकक्ष 0 है।
इसलिए आउटपुट 5 0 है।
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
void convertBinToDecimal(int n) {
int arr[64] = {0};
int x = 0, index;
// बाइनरी में बदलें (LSB पहले संग्रहीत)
for (index = 0; n > 0; index++) {
arr[index] = n % 2;
n /= 2;
}
x = (index < 3) ? 3 : index;
int d = 0, p = 0;
// पहले तीन बिट्स (MSB पक्ष) - सरणी में उच्च इंडेक्स
for (int i = x - 3; i < x; i++) {
d += arr[i] * pow(2, p++);
}
cout << d << " ";
// अंतिम तीन बिट्स (LSB पक्ष) - सरणी में निम्न इंडेक्स
d = 0; p = 0;
for (int i = 0; i < 3; i++) {
d += arr[i] * pow(2, p++);
}
cout << d;
}
int main() {
int n = 57;
cout << "संख्या " << n << " के पहले और अंतिम बिट्स का दशमलव रूपांतरण है ";
convertBinToDecimal(n);
return 0;
}
आउटपुट
संख्या 57 के पहले और अंतिम बिट्स का दशमलव रूपांतरण है 7 1
व्याख्या (57 के लिए)
57 का बाइनरी: 111001 (6 बिट्स)
- पहले 3 बिट्स (MSB): 111 = 7
- अंतिम 3 बिट्स (LSB): 001 = 1
जटिलता विश्लेषण
- समय जटिलता: O(log N) - बिट्स की संख्या
- स्पेस जटिलता: O(log N) - बिट सरणी के लिए
बिटवाइज़ ऑपरेशन का उपयोग करके अनुकूलित संस्करण
int last3 = n & 7; // अंतिम 3 बिट्स (2³ - 1 = 7) int totalBits = 32 - __builtin_clz(n); // या 64-बिट के लिए 64 int first3 = (n >> (totalBits - 3)) & 7; // पहले 3 बिट्स
यह O(1) समय और O(1) स्पेस में काम करता है।