ในปัญหานี้ เราได้รับค่าจำนวนเต็ม N หน้าที่ของเราคือสร้างโปรแกรมเพื่อค้นหาหมายเลขสำรองถัดไป
จำนวนน้อย เป็นตัวเลขชนิดพิเศษที่การแปลงเลขฐานสองไม่มี 1 ตัวติดกัน
Example: 5(101) , 16(10000)
คำอธิบายปัญหา − สำหรับจำนวนที่กำหนด N เราจำเป็นต้องหาจำนวนที่น้อยที่สุดที่มากกว่า N ซึ่งเป็นจำนวนเบาบาง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
N = 7
ผลลัพธ์
8
คำอธิบาย
เลขฐานสองของ 8 คือ 1,000 ซึ่งทำให้เป็นจำนวนเบาบางที่น้อยที่สุดที่มากกว่า n
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการตรวจสอบตัวเลขทั้งหมดที่มากกว่า N และหยุดจนกว่าเราจะพบจำนวนเบาบางตัวแรกของเรา
สำหรับสิ่งนี้เราต้องวนซ้ำจาก N ถึงอนันต์และสำหรับตัวเลขแต่ละตัวตรวจสอบว่าเป็นจำนวนเบาบางหรือไม่ ถ้าใช่ ให้ทำลายลูปไม่เช่นนั้นให้ดำเนินการต่อ
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<iostream> using namespace std; bool isSpareNumber(int N){ int currentBit = (N&1); int nextBit ; while (N!= 0){ nextBit = currentBit; currentBit = (N&1); N >>= 1; if(nextBit == currentBit && nextBit == 1 && currentBit == 1) return false ; } return true; } int findNextSparseNumber(int N) { while(1){ if(isSpareNumber(N)) return N; N++; } return -1; } int main() { int N = 564; cout<<"The number is "<<N<<endl; cout<<"The next Sparse Number is "<<findNextSparseNumber(N); return 0; }
ผลลัพธ์
The number is 564 The next Sparse Number is 576
แนวทางที่มีประสิทธิภาพ
วิธีที่มีประสิทธิภาพในการแก้ปัญหาคือการจัดการบิตของตัวเลข สำหรับสิ่งนี้ เราจะค้นหาเลขฐานสองของตัวเลขและจัดการบิตที่เกิดความใกล้เคียงกัน ข้ามจากบิตที่มีนัยสำคัญน้อยที่สุดไปยังบิตที่มีนัยสำคัญมากที่สุด เมื่อเราพบคู่ของ 1 ร่วมกัน เราจะแทนที่ทั้ง 1 ตัวด้วย 0 และสร้างบิตถัดไป 1 และทำสิ่งนี้จนกว่าเราจะไปถึง MSB แล้วแปลงเลขฐานสองของตัวเลขกลับเป็นเลขฐานสิบซึ่งเป็นผลลัพธ์ของเรา
มาดูตัวอย่างกัน
ไม่มี =52
เลขฐานสองคือ 110100
เราจะสำรวจจาก LSB และหาคู่แรกของ 1 ที่ต่อเนื่องกันในไบนารี มันคือ 11 0100 ส่วนที่ไฮไลท์ จากนั้นเราจะแทนที่ทั้ง 1 ด้วย 0 และเพิ่มหนึ่งในบิตถัดไป ทำให้จำนวน 1000000 ที่มีการแปลงไบนารีเป็น 64 .
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<iostream> using namespace std; int findNextSparseNumber(int N) { int spNum[16]; int n = 0; while (N != 0) { spNum[n] = (N&1); n++; N >>= 1; } n++; int lastCorrectedBit = 0; for (int i= 0 ; i< n; i++) { if (spNum[i] == 1 && spNum[i-1] == 1 && spNum[i+1] != 1){ spNum[i+1] = 1; for (int j=i; j>=lastCorrectedBit; j--) spNum[j] = 0; lastCorrectedBit = i+1; } } int sparseNumber = 0; for (int i =0; i<n-1; i++) sparseNumber += spNum[i]*(1<<i); return sparseNumber; } int main() { int N = 564; cout<<"The number is "<<N<<endl; cout<<"The next Sparse Number is "<<findNextSparseNumber(N); return 0; }
ผลลัพธ์
The number is 564 The next Sparse Number is 576