समस्या कथन
किसी संख्या को देखते हुए उसकी चरम स्थितियों पर बिट्स की अदला-बदली करके इसे अधिकतम करें, यानी पहले और अंतिम स्थान पर, दूसरी और दूसरी अंतिम स्थिति पर और इसी तरह।
यदि इनपुट संख्या 8 है तो इसका द्विआधारी प्रतिनिधित्व है-
00000000 00000000 00000000 00001000
चरम स्थितियों पर बिट्स की अदला-बदली के बाद संख्या बन जाती है -
00010000 00000000 00000000 00000000 and its decimal equivalent is: 268435456
एल्गोरिदम
1. Create a copy of the original number 2. If less significant bit is 1 and more significant bit is 0 then swap the bits in the bit from only, continue the process until less significant bit’s position is less than more significant bit’s position 3. Return new number
उदाहरण
#include <bits/stdc++.h> #define ull unsigned long long using namespace std; ull getMaxNumber(ull num){ ull origNum = num; int bitCnt = sizeof(ull) * 8 - 1; int cnt = 0; for(cnt = 0; cnt < bitCnt; ++cnt, --bitCnt) { int m = (origNum >> cnt) & 1; int n = (origNum >> bitCnt) & 1; if (m > n) { int x = (1 << cnt | 1 << bitCnt); num = num ^ x; } } return num; } int main(){ ull num = 8; cout << "Maximum number = " << getMaxNumber(num) << endl; return 0; }
आउटपुट
जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्न आउटपुट उत्पन्न करता है -
Maximum number = 268435456