Computer >> Máy Tính >  >> Lập trình >> lập trình C

Đếm số bit tối thiểu để lật sao cho XOR của A và B bằng C trong C ++

Chúng ta được cung cấp với ba dãy nhị phân A, B và C có độ dài N. Mỗi dãy biểu diễn số nhị phân. Chúng tôi phải tìm thấy không. trong số các lần lật bắt buộc của các bit trong A và B sao cho XOR của A và B dẫn đến C. A XOR B trở thành C.

Trước hết, chúng ta hãy tìm hiểu về bảng sự thật của phép toán XOR -

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

Từ bảng trên, chúng ta quan sát thấy rằng đối với các giá trị giống nhau trong X và Y, X XOR Y cho kết quả bằng 0 khác kết quả là 1. Vì vậy, điều này sẽ hữu ích cho việc tìm kiếm các bit được lật trong A và B để đạt được C. Các trường hợp sẽ là

  • Nếu A [i] ==B [i] và C [i] ==0 thì không lật,
  • Nếu A [i] ==B [i] và C [i] ==1 thì lật A [i] hoặc B [i] và tăng số lần lật lên 1
  • Nếu A [i]! =B [i] và C [i] ==0 thì lật A [i] hoặc B [i] và tăng số lần lật lên 1
  • Nếu A [i]! =B [i] và C [i] ==1 thì không cần lật.

Đầu vào

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

Đầu ra

Required flips : 2

Giải thích

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

Đầu vào

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

Đầu ra

Required flips : 2

Giải thích

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

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Mảng a [], b [] và c [] được sử dụng để lưu trữ số nhị phân.

  • Hàm flipCount (int A [], int B [], int C [], int n) nhận mảng a, b, c và độ dài n asinput của chúng và trả về số lần lật bắt buộc tính bằng bit của A [] hoặc B [ ] để lấy C [] là A xorB

  • Số lượng biến thể hiện số lần lật và được khởi tạo bằng 0.

  • Sử dụng vòng lặp for duyệt từng bit trong ô từ i =0 đến i

  • Đối với mỗi bit A [i] và B [i]. nếu chúng bằng nhau và C [i] là 1 số tăng.

  • Đối với mỗi bit A [i] và B [i]. nếu chúng không bằng nhau và C [i] là 0 số tăng.

  • Trả lại số lượng như kết quả mong muốn.

Ví dụ

#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;
}

Đầu ra

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