使用C++查詢僅在第L位到第R位之間設定了位的數字


在這個問題中,我們需要找到一個數字的值,該數字在給定的範圍L,R之間所有位都設定為1。

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

尋找解決方案的方法

在這個問題中,我們將討論兩種方法:暴力法和高效方法。

暴力法

在這種方法中,我們將簡單地遍歷給定的範圍,並將給定範圍內所有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設定為1到R。然後我們需要減去一個數字,該數字的所有位都從1設定為1到(L-1),因此我們制定了這個觀察結果。給定程式碼的整體時間複雜度為**O(1)**,這是常數時間複雜度,這意味著我們可以在常數時間內計算任何答案。

結論

本文將建立一個用於“僅在第L位到第R位之間設定了位的數字”的程式。我們還學習了這個問題的C++程式以及我們用來解決這個問題的完整方法(常規方法和高效方法)。我們可以用C、Java、Python和其他語言編寫相同的程式。我們希望您覺得本文有所幫助。

更新於:2021年11月26日

瀏覽量:110

開啟您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.