ভূমিকা
একটি সংখ্যা n দেওয়া থাকলে, সেটিকে 2^X - 1 রূপে রূপান্তর করার ধাপগুলো প্রিন্ট করতে হবে। নিয়ম:
- বিজোড় ধাপে (Step 1, 3, 5...): যেকোনো 2^M - 1 দিয়ে XOR অপারেশন করা (M আপনি বেছে নেবেন)
- জোড় ধাপে (Step 2, 4, 6...): সংখ্যাকে ১ বাড়ানো
এই প্রক্রিয়া চলবে যতক্ষণ না n, 2^X - 1 রূপে আসে।
উদাহরণ
ইনপুট: 22 আউটপুট: Step 1: Xor with 15 Step 2: Increase by 1 Step 3: Xor with 7 Step 4: Increase by 1 Step 5: Xor with 1 ইনপুট: 7 আউটপুট: No Steps to be performed
এলগরিদম
int find_leftmost_unsetbit(int n)
শুরু
ind = -1, i = 1
যতক্ষণ n != 0:
যদি (n & 1) == 0 হয়: ind = i
i++
n = n >> 1 (ডান শিফট)
ind রিটার্ন করুন
শেষ
void perform_steps(int n)
শুরু
left = find_leftmost_unsetbit(n)
যদি left == -1: "No Steps to be performed" প্রিন্ট করে রিটার্ন
step = 1
যতক্ষণ find_leftmost_unsetbit(n) != -1:
যদি step জোড় হয়:
n = n + 1
"Step n: Increase by 1" প্রিন্ট
অন্যথায়:
m = find_leftmost_unsetbit(n)
num = 2^m - 1
n = n ^ num
"Step n: Xor with num" প্রিন্ট
step++
লুপ শেষ
শেষ
C প্রোগ্রাম উদাহরণ
#include#include int find_leftmost_unsetbit(int n) { int ind = -1, i = 1; while (n) { if (!(n & 1)) ind = i; i++; n >>= 1; } return ind; } void perform_steps(int n) { int left = find_leftmost_unsetbit(n); if (left == -1) { printf("No Steps to be performed\n"); return; } int step = 1; while (find_leftmost_unsetbit(n) != -1) { if (step % 2 == 0) { n += 1; printf("Step %d: Increase by 1\n", step); } else { int m = find_leftmost_unsetbit(n); int num = (int)(pow(2, m) - 1); n = n ^ num; printf("Step %d: Xor with %d\n", step, num); } step++; } } int main() { int n = 22; perform_steps(n); return 0; }
আউটপুট
Step 1: Xor with 15 Step 2: Increase by 1 Step 3: Xor with 7 Step 4: Increase by 1 Step 5: Xor with 1