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

C++でAとBのXORがCと等しくなるようにフリップする最小ビットをカウントします


長さNの3つのバイナリシーケンスA、B、Cが与えられます。各シーケンスは2進数を表します。いいえを見つける必要があります。 AとBのXORがCになるようにAとBのビットに必要なフリップの数。AXORBはCになります。

まず、XOR演算の真理値表について学びましょう-

X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0

上記の表から、XとYの同じ値の場合、X XOR Yの結果は0になり、それ以外の場合は1になります。したがって、これは、AとBで反転してCに到達するビットを見つけるのに役立ちます。>>

  • A [i] ==B[i]およびC[i]==0の場合、フリップはありません。
  • A [i] ==B[i]およびC[i]==1の場合、A[i]またはB[i]のいずれかを反転し、反転カウントを1増やします
  • A [i]!=B[i]およびC[i]==0の場合、A[i]またはB[i]のいずれかを反転し、反転カウントを1増やします
  • A [i]!=B[i]およびC[i]==1の場合、フリップは必要ありません。

入力

A[]= { 0,0,0,0 } B[]= { 1,0,1,0 } C= {1,1,1,1}

出力

Required flips : 2

説明

A[0] xor B[0] 0 xor 1 = 1 C[0]=1 no flip
A[1] xor B[1] 0 xor 0 = 0 C[0]=1 flip count=1
A[2] xor B[2] 0 xor 1 = 1 C[0]=1 no flip
A[3] xor B[3] 0 xor 0 = 0 C[0]=1flip count=2

入力

A[]= { 0,0,1,1 } B[]= { 0,0,1,1 } C= {0,0,1,1}

出力

Required flips : 2

説明

A[0] xor B[0] 0 xor 0 = 0 C[0]=0 no flip
A[1] xor B[1] 0 xor 0 = 0 C[0]=0 no flip
A[2] xor B[2] 1 xor 1 = 0 C[0]=1 flip count=1
A[3] xor B[3] 1 xor 1 = 0 C[0]=1 flip count=2

以下のプログラムで使用されているアプローチは次のとおりです

  • 配列a[]、b []、およびc []は、2進数を格納するために使用されます。

  • 関数flipCount(int A []、int B []、int C []、int n)は、配列a、b、cとその長さnを入力として受け取り、A[]またはB[のいずれかのビットで必要なフリップの数を返します。 ]C[]をAxorBとして取得する

  • 変数カウントはフリップカウントを表し、0で初期化されます。

  • forループを使用して、セル内の各ビットをi=0からi

    までトラバースします。
  • 各ビットA[i]およびB[i]について。それらが等しく、C[i]が1増加カウントの場合。

  • 各ビットA[i]およびB[i]について。それらが等しくなく、C[i]が0の場合はカウントを増やします。

  • 必要な結果としてカウントを返します。

#include<bits/stdc++.h>
using namespace std;
int flipCount(int A[], int B[], int C[], int N){
   int count = 0;
   for (int i=0; i < N; ++i){
      // If both A[i] and B[i] are equal then XOR results 0, if C[i] is 1 flip
      if (A[i] == B[i] && C[i] == 1)
         ++count;
         // If Both A and B are unequal then XOR results 1 , if C[i] is 0 flip
      else if (A[i] != B[i] && C[i] == 0)
         ++count;
   }
   return count;
}
int main(){
   //N represent total count of Bits
   int N = 5;
   int a[] ={1,0,0,0,0};
   int b[] ={0,0,0,1,0};
   int c[] ={1,0,1,1,1};
   cout <<"Minimum bits to flip such that XOR of A and B equal to C :"<<flipCount(a, b, c,N);
   return 0;
}

出力

Minimum bits to flip such that XOR of A and B equal to C :2

  1. xとその桁の合計がC++で指定されたnと等しくなるような数xを見つけます

    ここで、1つの問題が発生します。ここで、数値nを取得する場合、x +桁の合計xが指定された数値nと同じになるように、xなどの別の値を見つける必要があります。 nの値が21であると仮定します。このプログラムは、15+桁の合計15、つまり15 + 1 + 5 =21=nとして数値x=15を返します。 この問題を解決するには、単純なアプローチに従う必要があります。 1からnまで繰り返し、各繰り返しで、数値とその桁の合計の合計が数値と同じであるかどうかを確認し、停止します。それ以外の場合は続行します。 例 #include<iostream> using namespace std; i

  2. XORがC++の別の配列と等しくなるように、2つのバイナリ配列の最小フリップ。

    問題の説明 サイズnの0と1の3つの配列が与えられた場合、タスクは、1番目と2番目の配列のi番目のインデックスビットのXORがi番目のインデックスビットと等しくなるように、1番目と2番目の配列のビットの最小フリップを見つけることです。 3番目の配列。 反転できるのは、配列1の最大pビットと配列2の最大qビットのみであることに注意してください。また、配列要素の再配置は許可されていません。 p=2およびq=5と仮定します arr1[] = {1, 0, 1, 1, 0, 1, 0} arr2[] = {0, 1, 0, 1, 0, 0, 1} arr3[] = {0, 1, 1, 0, 0,