C ++
 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

解決策を見つけるためのアプローチ

与えられた問題では、ブルートフォースと効率的なアプローチの2つのアプローチについて説明します。

ブルートフォース

このアプローチでは、指定された範囲をトラバースし、指定された範囲に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 ++プログラムと、この問題を解決するための完全なアプローチ(通常および効率的)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。この記事がお役に立てば幸いです。


  1. C++を使用してセットの反射関係の数を見つける

    この記事では、集合上の反射関係の数を見つけるためのアプローチについて説明します。この問題では、数nが与えられ、n個の自然数のセットで、反射関係の数を決定する必要があります。 反射関係 −集合Aの関係は、(a、a)が集合Aに属するすべてのaがRに属する場合、反射的と呼ばれます。たとえば、- Input : x = 1 Output : 1 Explanation : set = { 1 }, reflexive relations on A * A : { { 1 } } Input : x = 2 Output : 4 Explanation : set = { 1,2 }, reflex

  2. C++を使用してサッカーの五角形と六角形の数を見つける

    ご存知のように、五角形と六角形はサッカーの重要な部分です。これらの形状は、完全な球形を形成するためのパズルのように組み合わされます。ですから、ここにサッカーがあり、六角形と五角形を見つける必要があります。 問題を簡単に解決するためにオイラー標数を使用します。オイラー標数は、位相空間の特定の形状または構造を記述するために機能する数値です。したがって、サッカーの五角形と六角形の数を計算するために使用できます。 オイラー標数- chi(S) −比表面積Sの整数 F −顔 G −グラフ V −頂点 E −エッジはSに埋め込まれています。 V - E + F