C - 异或循环 - Kattis - Oddmanout

C - XOR Loop - Kattis - Oddmanout

我是编程新手。我正在学习 XOR 以尝试在 Kattis 上解决课堂作业问题的 oddmanout 问题。

我正在尝试的是在一系列数字中找到奇怪的人。除一个号码外,每个号码都有一对。我必须找到没有的号码。我下面的代码应该对数组中的每个数字进行异或运算以找到 "odd man".

但是,由于我不知道为什么 XOR 会输出错误的答案,所以我在这个网站上发帖,寻求帮助。

我的输入是:

3
3
1 2147483647 2147483647
5 
3 4 7 4 3
5
2 10 2 10 5

我的输出是:

Case #1: 3
Case #2: 4
Case #3: 4

我预计得到:

Case #1: 1
Case #2: 7
Case #3: 5

提前感谢您的帮助!

我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
  int N,i,n,j,a=0,num=1;
  int guest[1000],cas[16];
  scanf("%d",&N);

  printf("N is: %d\n",N);

  while(N!=0){
    scanf("%d",&n);
    j=0;

printf("n is: %d\n",n);

    for(i=0;i<n;i++){
      scanf("%d",&guest[i]);
      j=j^i;

      printf("guests are: %d\n",guest[i]);
    }

printf("j is: %d\n",j);

    cas[a]=j;
    a++;
    N--;

    printf("N is: %d\n a is: %d\n",N,a);

  }


  for(i=0;i<a;i++){
    printf("Case #%d: %d\n",num,cas[i]);
    num++;
  }

 return 0;
}

正如 user3528438 在评论中提到的,您的行 j=j^i; 应该是 j=j^guest[i];。您想与您输入的数组成员进行异或运算,而不是与数组的索引进行异或运算。

您应该养成尽早注释代码的习惯,并为变量命名以使代码更易于阅读。它可以更容易地发现这样的错误,并且如果您稍后必须返回到您的代码,也会省去您的心痛。