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
-
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で除算し、ビットを格納し続けます
-
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