“异或”运算是C语言中一种比较冷僻的运算,除了一些特定领域的问题(如加密、图像处理等),较少有恰当的应用场合。以至于大多数C语言书在讲到异或这个运算时,一般都干巴巴的很生硬。

  日前,看到 人人校招笔试题  中的对某问题的求解,发现异或在某些特定场合有非常奇妙的、恰如其分的甚至可说是舍我其谁的应用。

  人人校招笔试题 中的问题是这样的:

  给定一个有序数组a,长度为len,和一个数x,判断A数组里面是否存在两个数,他们的和为x,bool judge(int *a, int len, int x),存在返回true,不存在则返回false。

  这个问题并不太难,除了博主给出了代码,另有网友给出了另外两种代码。

代码1 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Judge(int *a, int len, int x)
{
    int Ascending = 0;//为1表示升序,否则降序
    Ascending = a[1] > a[0] ? 1 : 0;
    int *CopyA = (int *)malloc(sizeof(int) * len);
    memset(CopyA, 0, sizeof(int) * len);
    //构建另一数组
    int icount = 0;
    for(icount = 0; icount < len; icount++)
    {
        CopyA[icount] = x - a[icount];
    }
    //比较两个指针移动的值,这里用索引代替指针
    int i = len - 1, j = 0;
    while(i >= 0 && j < len)
    {
        if(a[i] > CopyA[j])
        {
            switch(Ascending)
            {
                case 0: j++; break;//降序
                case 1: i--; break;//升序
                default:break;
            }
        }
        else if(a[i] == CopyA[j])
        {
            return 1;
        }
        else
        {
            switch(Ascending)
            {
                case 0: i--; break;//降序
                case 1: j++; break;//升序
                default:break;
            }
        }
    }
    return 0;
}
int main()
{
    int a[] = {59,41,21,10,5};
    int len = 5;
    int x = 190;
    switch(Judge(a, len, x))
    {
        case 0: printf("%d isn't exist!", x);break;
        case 1: printf("%d is exist!", x);break;
        default : break;
    }
    return 0;
}
View Code

相关文章:

  • 2021-07-27
  • 2022-12-23
  • 2021-11-09
  • 2021-07-28
  • 2022-02-09
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-10
  • 2022-12-23
  • 2021-11-30
  • 2021-09-15
  • 2021-09-06
  • 2021-11-22
相关资源
相似解决方案