양의 정수 배열이 제공됩니다. 2의 거듭제곱이 될 수 있는 수의 개수를 구하는 것이 목표입니다. 1을 극한에 한 번 더하면 됩니다.
log2(i)를 사용하여 숫자가 2의 거듭제곱인지 또는 1을 더함으로써 2의 거듭제곱이 될 수 있는지 확인합니다. 예인 경우 카운트를 증가시킵니다.
예를 들어 이해합시다.
입력 - 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) 함수는 배열과 그 길이를 입력으로 받아 2의 거듭제곱이거나 2의 거듭제곱이 될 수 있는 숫자의 개수를 반환합니다.
-
초기 카운트를 0으로 합니다.
-
i=0에서 i
까지 배열 탐색 -
각 요소에 대해 floor(log2(arr[i]))==ceil((log2(arr[i])) 또는 floor(log2(arr[i]+1))==ceil((log2(arr[ i]+1)) , true인 경우 두 경우 모두 증가합니다.
-
최종 결과로 카운트를 반환합니다.
예
#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