C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのバイナリ配列のサブ配列の10進値のクエリ


この問題では、バイナリ配列bin []が与えられ、Qクエリはそれぞれ2つの値LとRで構成されます。私たちのタスクはC++のバイナリ配列のサブ配列の10進値のクエリを解決するプログラムを作成することです

問題の説明 −ここで各クエリを解決するには、LからRまでのサブアレイによって作成された10進数、つまりサブアレイ[L...R]を見つけて出力する必要があります。

問題を理解するために例を見てみましょう

入力

bin[] = {1, 1, 0, 0, 1, 0, 1, 0, 0, 0}
Q = 2
2 5
0 6

出力

2 101

説明

クエリ1の場合、形成されるサブ配列は{0、0、1、0}です。 10進数の変換が2である2進数0010が作成されます。

クエリ2の場合、形成されるサブ配列は{1、1、0、0、1、0、1}です。 10進数の変換が101である2進数1100101を作成します。

ソリューションアプローチ

簡単な解決策 は、バイナリ文字列をインデックスLからインデックスRにトラバースし、形成された2進数を見つけて、指定された2進数をそれに相当する10進数に変換することです。

私たちのアプローチの実装を示すプログラム

#include <iostream>
#include <math.h>
using namespace std;

int CalcDecimalValue(int bin[], int L, int R) {
   int decimal = 0;
   int j = 0;
   for(int i = R; i >= L; i--){
      decimal += bin[i] * pow(2, j);
      j++;
   }
   return decimal;
}

int main() {
   
   int bin[] = {1, 1, 0, 0, 1, 0, 1, 0, 0, 0};
   int n = sizeof(bin) / sizeof(bin[0]);
   int Q = 2;
   int query[Q][2] = {{2, 5},{0, 6}};
   for(int i = 0; i < Q; i++){
      cout<<"For query "<<(i+1)<<": The decimal value of subarray is "<<CalcDecimalValue(bin, query[i]   [0], query[i][1])<<"\n";
   }
   return 0;
}

出力

For query 1: The decimal value of subarray is 2
For query 2: The decimal value of subarray is 101

別のアプローチ 問題を解決するには、事前に計算された配列を使用します。 (n-i)番目のインデックス値までに作成された10進数を格納する事前計算された配列を作成します。そして、クエリを解くために、lとrの値の違いを見つけます。

配列のi番目の値は、2進数から10進数への変換式を使用して検出されます。右側から、つまりn-1から適用します

decimalArray [i] =bin [i] * 2 ^(n-1-i)+ bin [i + 1] * 2 ^(n-1-i + 1)+…bin [n-1] * 2 ^( 0)。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
int decimalArray[1000];

void createDecimalArray(int bin[], int n){
   memset(decimalArray, 0, n*sizeof(int));
   decimalArray[n - 1] = bin[n - 1] * pow(2, 0);
   for (int i = n - 2; i >= 0; i--)
   decimalArray[i] = decimalArray[i + 1] + bin[i] * (pow(2,(n - 1 - i)));
}

int CalcDecimalValue(int L, int R, int n){
   if (R != n - 1)
   return (decimalArray[L] - decimalArray[R + 1]) / (pow(2, (n - 1 - R)));
   return decimalArray[L] / (1 << (n - 1 - R));
}

int main(){

   int bin[] = {1, 1, 0, 0, 1, 0, 1, 0, 0, 0};
   int n = sizeof(bin) / sizeof(bin[0]);
   createDecimalArray(bin, n);
   int Q = 2;
   int query[Q][2] = {{2, 5},{0, 6}};
   for(int i = 0; i < Q; i++){
      cout<<"For query "<<(i+1)<<": The decimal value of subarray is "<<CalcDecimalValue(query[i][0],    query[i][1], n)<<"\n";
   }
   return 0;
}

出力

For query 1: The decimal value of subarray is 2
For query 2: The decimal value of subarray is 101

  1. C++での10進数から2進数への変換プログラム

    10進数を入力として指定すると、タスクは指定された10進数を2進数に変換することです。 コンピューターの10進数は10進数で表され、2進数は2進数の0と1の2つしかないため、2進数で表されますが、10進数は0〜9から始まる任意の数値にすることができます。 10進数を2進数に変換するには、次の手順に従います- まず、指定された数値を変換数値の基本値で除算します。例: 42を2を底とする2進数に変換し、商を取得して格納する必要があるため、42を2で除算します。余りが0の場合、ビットを0として格納します。それ以外の場合は1です。 取得した商を2進数の基数である2で除算し、ビットを格納し続けます

  2. C++での2進数から10進数への変換プログラム

    2進数を入力として指定すると、タスクは指定された2進数を10進数に変換することです。 コンピューターの10進数は10進数で表され、2進数は2進数の0と1の2つしかないため、2進数で表されますが、10進数は0〜9から始まる任意の数値にすることができます。 2進数を10進数に変換するには、右から左に向かって残りの数字を抽出し、0から始まる2の累乗を掛けて、(桁数)–1まで1ずつ増やします。乗算された値を加算し続けて、最終的な10進数値を取得します。 以下に、2進数を10進数に変換する図を示します。 例 Input-: 1010    0 will be conver