C中两组的联合和异或

时间:2016-10-03 01:07:04

标签: c loops set c99

程序跳过集合(数组)中的一个对象。

clang -ggdb3 -O0 -std = c99 -Wall -Werror prog.c -o prog

输出:

A和B的排他性或(异或):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;
}

1 个答案:

答案 0 :(得分:1)

你的逻辑因为几个原因而被激活。您假设整数值将与A和B的索引相同。如果A的长度小于B,则实际上只评估B.未定义的行为。

对于异或情况,请按照以下方式考虑:对于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案例的解决方案作为练习留给你。

相关问题