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