C中两个集合的联合和异或
Union and XOR of two sets in C
程序跳过一组(数组)中的一个对象。
clang -ggdb3 -O0 -std=c99 -Wall -Werror prog.c -o prog
输出:
A与B异或(XOR): 1 9 10 (但应该是: 1 2 9 10)
A和B的并集:1 3 6 9 10(但应该是:1 2 3 6 9 10)
这个程序有什么问题?请帮忙!
#include <stdio.h>
int main(void)
{
int U[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int A[] = {2, 3, 6, 9};
int B[] = {1, 3, 6, 10};
int SizeOfU = sizeof(U) / sizeof(int);
int SizeOfA = sizeof(A) / sizeof(int);
int SizeOfB = sizeof(B) / sizeof(int);
printf("Exclusive or (XOR) of A and B: ");
for (int i = 0; i < SizeOfU; i++)
{
for (int j = 0; j < SizeOfB; j++)
{
if ((A[j] != B[j]) && ((U[i] == A[j]) || (U[i] == B[j])))
{
printf("%i ", U[i]);
i++;
j = 0;
}
}
}
printf("\n");
printf("Union of A and B: ");
for (int i = 0; i < SizeOfU; i++)
{
for (int j = 0; j < SizeOfA; j++)
{
if ((U[i] == A[j]) || (U[i] == B[j]))
{
printf("%i ", U[i]);
j = 0;
i++;
}
}
}
printf("\n");
return 0;
}
你的逻辑有几个问题。您假设整数值将在 A 和 B 的相同索引中。您实际上只是在评估 B。如果 A 的长度小于 B,则行为未定义....
对于 XOR 的情况,可以这样想:对于 U 中的每个项目,找到出现在 A 或 B 中但不是同时出现在两者中的项目:
for (int u = 0; i < SizeOfU; u++)
{
int inA = 0;
int inB = 0;
for (int a = 0; a < SizeOfA; a++)
{
inA = (A[a] == U[u]);
if (inA)
{
break;
}
}
for (int b = 0; b < SizeOfB; b++)
{
inB = (B[b] == U[u]);
if (inB)
{
break;
}
}
if ((inA && !inB) || (!inA && inB))
{
printf("%d", i);
}
}
printf("\n");
这解决了 XOR 集的情况。我将把 OR 案例的解决方案作为练习留给你。
程序跳过一组(数组)中的一个对象。
clang -ggdb3 -O0 -std=c99 -Wall -Werror prog.c -o prog
输出:
A与B异或(XOR): 1 9 10 (但应该是: 1 2 9 10)
A和B的并集:1 3 6 9 10(但应该是:1 2 3 6 9 10)
这个程序有什么问题?请帮忙!
#include <stdio.h>
int main(void)
{
int U[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int A[] = {2, 3, 6, 9};
int B[] = {1, 3, 6, 10};
int SizeOfU = sizeof(U) / sizeof(int);
int SizeOfA = sizeof(A) / sizeof(int);
int SizeOfB = sizeof(B) / sizeof(int);
printf("Exclusive or (XOR) of A and B: ");
for (int i = 0; i < SizeOfU; i++)
{
for (int j = 0; j < SizeOfB; j++)
{
if ((A[j] != B[j]) && ((U[i] == A[j]) || (U[i] == B[j])))
{
printf("%i ", U[i]);
i++;
j = 0;
}
}
}
printf("\n");
printf("Union of A and B: ");
for (int i = 0; i < SizeOfU; i++)
{
for (int j = 0; j < SizeOfA; j++)
{
if ((U[i] == A[j]) || (U[i] == B[j]))
{
printf("%i ", U[i]);
j = 0;
i++;
}
}
}
printf("\n");
return 0;
}
你的逻辑有几个问题。您假设整数值将在 A 和 B 的相同索引中。您实际上只是在评估 B。如果 A 的长度小于 B,则行为未定义....
对于 XOR 的情况,可以这样想:对于 U 中的每个项目,找到出现在 A 或 B 中但不是同时出现在两者中的项目:
for (int u = 0; i < SizeOfU; u++)
{
int inA = 0;
int inB = 0;
for (int a = 0; a < SizeOfA; a++)
{
inA = (A[a] == U[u]);
if (inA)
{
break;
}
}
for (int b = 0; b < SizeOfB; b++)
{
inB = (B[b] == U[u]);
if (inB)
{
break;
}
}
if ((inA && !inB) || (!inA && inB))
{
printf("%d", i);
}
}
printf("\n");
这解决了 XOR 集的情况。我将把 OR 案例的解决方案作为练习留给你。