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