আমাদের ধনাত্মক পূর্ণসংখ্যার একটি অ্যারে দেওয়া হয়েছে৷ লক্ষ্য হল সংখ্যাগুলির গণনা খুঁজে বের করা যেগুলিকে সর্বাধিক একবার 1 যোগ করে দুটির শক্তি করা যেতে পারে৷
আমরা log2(i) ব্যবহার করে পরীক্ষা করব যে সংখ্যাটি দুটির শক্তি বা এটিতে 1 যোগ করে দুটির শক্তি হতে পারে। যদি হ্যাঁ ইনক্রিমেন্ট কাউন্ট।
উদাহরণ দিয়ে বোঝা যাক।
ইনপুট − arr[]={1,3,2,5,6 },
আউটপুট − সংখ্যার গণনা যা 2:3 এর শক্তিতে পরিণত হতে পারে
ব্যাখ্যা − 1+1=2 → 21 , 3+1=4 → 22 , 2=21 অন্যান্য হয়ে যাবে 5+1=6, 6+1=7
ইনপুট − arr[]={2,4,8,16},
আউটপুট − সংখ্যার গণনা যা 2:4 এর শক্তিতে পরিণত হতে পারে
ব্যাখ্যা − সমস্ত 4টি সংখ্যা ইতিমধ্যেই 2 এর শক্তি।
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
-
আমরা এলোমেলো ধনাত্মক সংখ্যা দিয়ে শুরু করা একটি পূর্ণসংখ্যা অ্যারে অ্যারে নিই।
-
ফাংশন powofTwo(int arr[],int n) একটি অ্যারে এবং এর দৈর্ঘ্য ইনপুট হিসাবে নেয় এবং সংখ্যার একটি গণনা প্রদান করে যেগুলিকে দুটির পাওয়ার বা করা যেতে পারে।
-
0 হিসাবে প্রাথমিক গণনা নিন।
-
i=0 থেকে i
পর্যন্ত ট্রাভার্স অ্যারে -
প্রতিটি উপাদানের জন্য তল(log2(arr[i]))==ceil((log2(arr[i])) বা ফ্লোর(log2(arr[i]+1))==ceil((log2(arr[ i]+1)), উভয় ক্ষেত্রেই সত্য বৃদ্ধির গণনা হলে।
-
চূড়ান্ত ফলাফল হিসাবে রিটার্ন গণনা।
উদাহরণ
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int powofTwo(int arr[],int n){
int count=0;
for(int i=0;i<n;i++){
if( floor(log2(arr[i])) == ceil(log2(arr[i])) )
{ count++; }
else{
++arr[i];
if( floor(log2(arr[i])) == ceil(log2(arr[i])) )
{ count++; }
}
}
return count;
}
int main(){
int Arr[]={ 5,6,9,3,1 };
int len=sizeof(Arr)/sizeof(Arr[0]);
cout<<endl<<"Count of numbers with power of 2 possible: "<<powofTwo(Arr,len);
return 0;
} আউটপুট
যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −
উৎপন্ন করবেCount of numbers with power of 2 possible: 2