Chúng ta được cung cấp một mảng các số nguyên dương. Mục đích là để tìm số lượng các số có thể được tạo thành lũy thừa của hai bằng cách cộng 1 với chúng tối đa một lần.
Chúng tôi sẽ kiểm tra bằng cách sử dụng log2 (i) rằng số là lũy thừa của hai hoặc có thể trở thành lũy thừa của hai bằng cách thêm 1 vào nó. Nếu có, số lượng tăng dần.
Hãy cùng hiểu với các ví dụ.
Đầu vào - arr [] ={1,3,2,5,6},
Đầu ra - Đếm số có thể trở thành lũy thừa của 2:3
Giải thích - 1 + 1 =2 → 21, 3 + 1 =4 → 22, 2 =21 những người khác sẽ trở thành 5 + 1 =6, 6 + 1 =7
Đầu vào - arr [] ={2,4,8,16},
Đầu ra - Đếm số có thể trở thành lũy thừa của 2:4
Giải thích - Cả 4 số đều là lũy thừa của 2.
Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau
-
Chúng tôi lấy một mảng số nguyên arr [] được khởi tạo với các số dương ngẫu nhiên.
-
Hàm powofTwo (int arr [], int n) nhận một mảng và độ dài của nó làm đầu vào và trả về số lượng các số có hoặc có thể là lũy thừa của hai.
-
Lấy số lượng ban đầu là 0.
-
Chuyển ngang mảng từ i =0 đến i
-
Đối với mỗi phần tử, hãy kiểm tra xem tầng (log2 (arr [i])) ==ceil ((log2 (arr [i])) hay tầng (log2 (arr [i] +1)) ==ceil ((log2 (arr [ i] +1)), nếu số gia tăng đúng trong cả hai trường hợp.
-
Số lượt trả lại là kết quả cuối cùng.
Ví dụ
#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; }
Đầu ra
Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -
Count of numbers with power of 2 possible: 2