Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 주어진 연산에 의해 2의 거듭제곱이 될 수 있는 숫자의 개수


양의 정수 배열이 제공됩니다. 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