এই সমস্যায়, আমাদের একটি অ্যারে এবং একটি সংখ্যা N দেওয়া হয়েছে। আমাদের কাজ হলো চেক করা যে সংখ্যাটি ইবিল নাম্বার (Evil Number) নাকি ওডিয়াস নাম্বার (Odious Number)।
ইবিল নাম্বার: এটি একটি পজিটিভ সংখ্যা যার বাইনারি এক্সপ্যানশনে জোড় সংখ্যক ১ থাকে।
উদাহরণ: 5, 17
ওডিয়াস নাম্বার: এটি একটি পজিটিভ সংখ্যা যার বাইনারি এক্সপ্যানশনে বিজোড় সংখ্যক ১ থাকে।
উদাহরণ: 4, 6
উদাহরণ দিয়ে সমস্যাটি বোঝা যাক
ইনপুট: N = 65
আউটপুট: Evil Number
ব্যাখ্যা:
65-এর বাইনারি এক্সপ্যানশন: 1000001
সমাধানের পদ্ধতি
এই সমস্যার একটি সহজ সমাধান হলো সংখ্যাটির বাইনারি এক্সপ্যানশন বের করে সেটিতে ১-এর সংখ্যা গণনা করা। যদি কাউন্ট জোড় হয় তবে সংখ্যাটি ইবিল নাম্বার অন্যথায় ওডিয়াস নাম্বার।
সমাধানটি ব্যাখ্যা করে প্রোগ্রাম
#include <iostream>
using namespace std;
int isEvilNumber(int n) {
int count = 0;
while (n != 0) {
int r = n % 2;
if (r == 1)
count++;
n = n / 2;
}
if (count % 2 == 0)
return 1;
else
return 0;
}
int main(void) {
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