ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า n และ m งานของเราคือ หาจำนวนที่มากที่สุดด้วย n set และ m unset bits ในการแสดงเลขฐานสองของตัวเลข
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหา
Input : n = 3, m = 1 Output : 14
คำอธิบาย −
Largest number will have 3 set bits and then 1 unset bit. (1110)2 = 14
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาง่ายๆ คือ การหาจำนวนที่ประกอบด้วย (n+m) set bits จากหมายเลขนี้ ให้ปิด m บิตจากจุดสิ้นสุด (LSB) ในการสร้างตัวเลขด้วย (n+m) ชุดบิต
$$(1\ll(n+m))-1$$
จากนั้นสลับ m บิตแล้วส่งคืนหมายเลข
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream> using namespace std; int findlargestNumber(int n, int m){ int maxNum = (1 << (n + m)) - 1; if (m == 0) return maxNum; int number = (1 << m) - 1; return (maxNum ^ number); } int main(){ int n = 5, m = 2; cout<<"The largest number with "<<n<<" set bits and "<<m<<" unset bits is "<<findlargestNumber(n, m); return 0; }
ผลลัพธ์
The largest number with 5 set bits and 2 unset bits is 124