- 数组nums包含从0到n的所有整数,但是其中缺失了一个,请编写代码找出那一个缺失的整数。
解题思路:使用异或操作
异或运算的性质:
0^n=n //0和任何数异或仍然是任何数
0^0=0 //0和0异或任然是0
a^a=0 //任何数和自己本身异或仍然是自己本身
a^b=b^a //异或操作满足交换律
a^b^c=a^(b^c) //异或操作满足结合律
int MissNumber(int *nums,int size)
{
        int x=0;
        int i=0;
        for(i=0;i<size;i++)
        {
                x^=nums[i];
        }
        for(i=0;i<size;i++)
        {
                x^=i;
        }
        return x;
}
int main()
{
        int nums[MAX]={0};
        int i=0;
        int ch=0;
        printf("Please input:\n");
        while(1)
        {
                scanf("%d",&ch);
                nums[i++]=ch;
                if(i>=MAX)
                      break;
        }
        int size=sizeof(nums)/sizeof(nums[0]);
        int c=MissNumber(nums,size);
        printf("Missnumber is:%d\n",c);
        return 0;
}
假设输入:0 1 2 3 4 6 7 8 9 0 (数字可以不按顺序输入,异或满足交换律) 缺失的数字为 5
第一个for循环x=0^1^2^3^4^6^7^8^9^0
第二个for循环x=0^1^2^3^4^6^7^8^9^0^0^1^2^3^4^5^6^7^8^9
其中其他数字出现两次异或为0,剩下0和5异或为5,得出缺失的数字5










