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

การนับจำนวนที่สามารถยกกำลัง 2 โดยการดำเนินการที่กำหนดใน C++


เราได้รับอาร์เรย์ของจำนวนเต็มบวก เป้าหมายคือการหาจำนวนตัวเลขที่ยกกำลังสองได้โดยบวก 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 อยู่แล้ว

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

  • เราใช้อาร์เรย์จำนวนเต็ม arr[] ที่เริ่มต้นด้วยตัวเลขสุ่มบวก

  • ฟังก์ชัน powofTwo(int arr[],int n) รับอาร์เรย์และความยาวเป็นอินพุตและส่งกลับจำนวนตัวเลขที่เป็นหรือสร้างกำลังสองได้

  • นับเริ่มต้นเป็น 0

  • อาร์เรย์การเคลื่อนที่จาก i=0 ถึง i

  • สำหรับแต่ละองค์ประกอบตรวจสอบว่า floor(log2(arr[i]))==ceil((log2(arr[i])) หรือ floor(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