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

C++를 사용하여 L번째와 R번째 인덱스 사이에만 비트가 설정된 숫자 찾기

<시간/>

주어진 문제에서 우리는 주어진 범위 L, R 사이의 모든 세트 비트를 갖는 숫자 값을 찾아야 합니다. 예를 들어 -

Input: L = 1, R = 5
Output: 62
Explanation: representation of given L and R in binary form is 0..0111110

Input: L = 1, R = 4
Output: 30
Explanation: representation of given L and R in binary form is 0..11110

해결책을 찾기 위한 접근 방식

주어진 문제에서 우리는 Brute Force와 Efficient Approach의 두 가지 접근 방식에 대해 논의할 것입니다.

브루트 포스

이 접근 방식에서는 단순히 주어진 범위를 순회하고 주어진 범위에서 2의 거듭제곱을 모두 더하면 이것이 우리의 답이 될 것입니다.

예시

#include<bits/stdc++.h>
using namespace std;
int main() {
   int L = 1, R = 3; // the given range
   int ans = 0; // our answer
   for(int i = L; i <= R; i++) // traversing through the whole range
      ans += pow(2, i); // adding values to the answer.
   cout << ans << "\n";
}

출력

14

이 접근 방식에서 우리는 단순히 범위를 순회하고 범위에 있는 숫자의 2의 거듭제곱을 더합니다. 이 프로그램의 시간 복잡도는 O(N)입니다. , 여기서 N은 범위의 크기입니다. 그러나 주어진 질문에 비트에 대한 지식을 적용하여 시간 복잡도를 더욱 향상시킬 수 있습니다.

효율적인 접근

이 접근 방식에서는 답을 계산하는 공식을 간단히 만들 것입니다.

예시

#include<bits/stdc++.h>
using namespace std;
int main() {
   int L = 1, R = 3; // the given range
   int ans = 0; // our answer
   for(int i = L; i <= R; i++) // traversing through the whole range
      ans += pow(2, i); // adding values to the answer.
   cout << ans << "\n";
}

출력

14

이 접근 방식에서는 답을 계산하기 위한 공식을 만듭니다.

위 코드 설명

아시다시피, 우리는 주어진 범위에서 비트가 설정된 숫자를 계산해야 하므로 이 접근 방식에서는 0에서 R까지 모든 비트가 설정된 숫자를 찾습니다. 그런 다음 모든 비트가 있는 숫자를 빼야 합니다. 1에서 (L-1)까지 설정하므로 이 관찰을 공식화합니다. 주어진 코드의 전체 시간 복잡도는 O(1)입니다. 일정한 시간 복잡도는 일정한 시간에 모든 답을 계산할 수 있음을 의미합니다.

결론

이 기사에서는 "L번째와 R번째 인덱스 사이에만 비트가 설정되어 있는 숫자"에 대한 프로그램을 만들 것입니다. 우리는 또한 이 문제에 대한 C++ 프로그램과 이 문제를 해결한 완전한 접근 방식( Normal 및 Efficiency )에 대해 배웠습니다. C, Java, python 및 기타 언어와 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 기사가 도움이 되기를 바랍니다.