给出三个长度为N的二进制序列A,B和C。每个序列代表一个二进制数。我们必须找到没有。对A和B中的位进行所需的翻转,以使A和B的XOR导致C。XOR B变为C。
首先让我们了解XOR运算的真值表-
X | ÿ | 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 []用于存储二进制编号。
函数flipCount(int A [],int B [],int C [],int n)以数组a,b,c及其长度n作为输入,并以A []或B的位返回所需的翻转次数[]获得C []作为A xor B
可变计数表示翻转计数,并以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){ //如果A [i]和B [i]相等,则XOR结果为0,如果C [i]为1,则 if (A[i] == B[i] && C[i] == 1) ++count; //如果A和B都不相等,则XOR结果为1,如果C [i]为0,则翻转 else if (A[i] != B[i] && C[i] == 0) ++count; } return count; } int main(){ //N代表总位数 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 <<"翻转的最小位数,以使A和B的XOR等于C:"<<flipCount(a, b, c,N); return 0; }
输出结果
翻转的最小位数,以使A和B的XOR等于C:2
本文向大家介绍计算三元组(a,b,c)的数量,以使C ++中a ^ 2 + b ^ 2 = c ^ 2和1 <= a <= b <= c <= n,包括了计算三元组(a,b,c)的数量,以使C ++中a ^ 2 + b ^ 2 = c ^ 2和1 <= a <= b <= c <= n的使用技巧和注意事项,需要的朋友参考一下 我们得到一个整数n。目标是找到满足条件的三元组(3个数字一组)- a 2
本文向大家介绍在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d,包括了在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个整数列表。我们的任务是找到四个不同的整数,分别为(a,b)和(c,d)两对,这样a + b = c + d。如果有多个答案,则仅打印一个。假设数组元素像:A = [7
问题是要找出A和B(包括A和B)之间的数字总数等于S。 同时打印A和B(含)之间的最小数字。 输入: 由A、B、S组成的单线。 输出: 两行。 在第一行中,A和B之间的整数数,其位数之和等于S。 在第二行中,A和B之间的最小数字。 约束: 1. 1. 来源:黑客地球 我的解决方案只适用于30%的输入。对此最好的解决方案是什么? 我现在使用的算法计算最小数字的和,然后在十位数的每次更改后再次计算和。
我有两个双向量。双的值在-1000到1000之间。 两个向量包含相同的数字,但顺序不同。 例如 假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等: 我担心双重不精确。
本文向大家介绍计算在C ++中除数等于K的 我们给了两个数字N和K。目标是找到1到N之间具有等于[[,N]]中的K除数的除数。 我们将首先计算范围[1,N]中的K的除数,然后将其存储在变量count中。 现在我们将从i = 1到i = N开始。现在,对于每个数字num = i(使得i!= K),将num的除数计数在范围[1,N]中。并将它们的出现存储在变量除数中。 如果除数=计数,则num在[1,
本文向大家介绍计算元素,以便在C ++中恰好有X个元素的值大于或等于X,包括了计算元素,以便在C ++中恰好有X个元素的值大于或等于X的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目标是找到满足以下条件的数组中元素的数量- 对于每个元素,数组中存在的大于或等于它的数字计数应完全等于它。排除元素本身。如果element是X,则数组具有正好X个数字,这些数字大于或等于X。(不包括元素)