นิยาม
- Evil Number: จำนวนบวกที่มีจำนวนบิต 1 ในรูปแบบไบนารีเป็น เลขคู่ (เช่น 5=101₂, 17=10001₂)
- Odious Number: จำนวนบวกที่มีจำนวนบิต 1 ในรูปแบบไบนารีเป็น เลขคี่ (เช่น 4=100₂, 6=110₂)
ตัวอย่าง
Input: N = 65
Output: Evil Number
อธิบาย: 65 = 1000001₂ (มี 1 สองตัว -> คู่)
แนวทางแก้ปัญหา
นับจำนวนบิต 1 (Population Count / Hamming Weight) ในตัวเลข:
- วนลูปหาร 2 เก็บเศษ นับจำนวนครั้งที่เศษ = 1
- หรือใช้ Built-in:
__builtin_popcount(n)(GCC/Clang)
โปรแกรมตัวอย่าง
#include <iostream>
using namespace std;
int isEvilNumber(int n) {
int count = 0;
while (n != 0) { if (n % 2 == 1) count++; n /= 2; }
return (count % 2 == 0) ? 1 : 0;
}
int main() {
int num = 2049;
if (isEvilNumber(num)) cout << "The number " << num << " is an Evil Number";
else cout << "The number " << num << " is an Odious Number";
return 0;
}
ผลลัพธ์
The number 2049 is an Evil Number