Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับจำนวนที่มีบิตเซ็ตเพียง 1 ตัวในช่วง [0, n] ใน C++


เราได้รับตัวเลขและงานคือการคำนวณจำนวนตัวเลขจากช่วง 0 ถึงตัวเลขที่กำหนดสมมติว่า num ที่มีบิตเซ็ต (set bit) เพียง 1 ตัวเท่านั้น

บิตเซ็ตในตัวเลขไบนารีแทนด้วย 1 ทุกครั้งที่เราคำนวณตัวเลขไบนารีของค่าจำนวนเต็ม มันจะประกอบด้วย 0 และ 1 ดังนั้น ตัวเลข 1 จึงเรียกว่า set bit ในทางคอมพิวเตอร์

อินพุต − int num = 15

เอาต์พุต − นับจำนวนที่มีบิตเซ็ตเพียง 1 ตัวในช่วง [0, 15] คือ − 4

คำอธิบาย − ตัวเลขที่กำหนดคือ 15 ดังนั้นช่วงคือ 0-15 คำนวณตัวเลขไบนารี 4 หลักสำหรับ: 0 → 0000 = 0 set bit, 1 → 0001 = 1 set bit, 2 → 0010 = 1 set bit, 3 → 0011 = 2 set bit, 4 → 0100 = 1 set bit, 5 → 0101 = 2 set bit, 6 → 0110 = 2 set bit, 7 → 0111 = 3 set bit, 8 → 1000 = 1 set bit, 9 → 1001 = 2 set bit, 10 → 1010 = 2 set bit, 11 → 1011 = 3 set bit, 12 → 1100 = 2 set bit, 13 → 1101 = 3 set bit, 14 → 1110 = 3 set bit, 15 → 1111 = 4 set bits ตอนนี้เราจะเลือกตัวเลขที่มีบิตเซ็ตเพียง 1 ตัว และได้คือ 1, 2, 4 และ 8

อินพุต − int num = 4

เอาต์พุต − นับจำนวนที่มีบิตเซ็ตเพียง 1 ตัวในช่วง [0, 15] คือ − 3

คำอธิบาย − ตัวเลขที่กำหนดคือ 4 ดังนั้นช่วงคือ 0-4 คำนวณไบนารี 4 หลักสำหรับ: 0 → 0000 = 0 set bit, 1 → 0001 = 1 set bit, 2 → 0010 = 1 set bit, 3 → 0011 = 2 set bit, 4 → 0100 = 1 set bit ตอนนี้เลือกตัวเลขที่มีบิตเซ็ตเพียง 1 ตัว ได้คือ 1, 2 และ 4

วิธีการที่ใช้ในโปรแกรมด้านล่าง

สามารถมีหลายวิธีในการแก้ปัญหาที่กำหนด คือ วิธีเรียบง่ายและวิธีที่มีประสิทธิภาพ มาดู วิธีเรียบง่าย ก่อน

  • รับตัวเลขและส่งไปยังฟังก์ชันเพื่อประมวลผลต่อ

  • ใช้ตัวแปรชั่วคราว count เพื่อเก็บจำนวนตัวเลขในช่วงที่มี set bit เป็น 1 อย่างแม่นยำ

  • เริ่มลูป FOR จาก i = 1 ถึงตัวเลข

  • ภายในลูป ตั้งตัวแปร temp ด้วย '__builtin_popcount(i)' ฟังก์ชันที่คืนจำนวน set bit

  • ตรวจสอบ IF temp == 1 แล้วเพิ่ม count

  • คืนค่า count

  • พิมพ์ผลลัพธ์

วิธีที่มีประสิทธิภาพ

  • รับตัวเลขและส่งไปยังฟังก์ชันเพื่อประมวลผลต่อ

  • ใช้ตัวแปรชั่วคราว count เพื่อเก็บจำนวนตัวเลขในช่วงที่มี set bit เป็น 1 อย่างแม่นยำ

  • เริ่มลูป While จาก temp จนกว่า temp <= ตัวเลข

  • ภายในลูป เพิ่ม count ขึ้น 1 และตั้ง temp = temp * 2

  • คืนค่า count

  • พิมพ์ผลลัพธ์

ตัวอย่าง (วิธีเรียบง่าย)

#include <iostream> using namespace std; //function to Count of numbers having only 1 set bit in the range [0, n] int set_bits(int number){    int count = 0;    for (int i = 1; i <= number; i++){       int temp = __builtin_popcount(i);       if (temp == 1){          count++;       }    }    return count; } int main(){    int number = 15;    cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number);    return 0; }

เอาต์พุต

ถ้าเรารันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −

Count of numbers having only 1 set bit in the range [0, 15] are: 4

ตัวอย่าง (วิธีที่มีประสิทธิภาพ)

#include <iostream> using namespace std; //function to Count of numbers having only 1 set bit in the range [0, n] int set_bits(int number){    int count = 0;    int temp = 1;    while(temp <= number){       count++;       temp = temp *2;    }    return count; } int main(){    int number = 15;    cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number);    return 0; }

เอาต์พุต

ถ้าเรารันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −

Count of numbers having only 1 set bit in the range [0, 15] are: 4