hdu 2095 find your present (2)

题解:

  用到异或的知识,a^a = 0,  a^0 = a. 因为题目中说道你的礼物的号码有奇数个,其它的号码有偶数个。把每个数用异或符连接起来,运算号就剩下一个本来奇数个的号码了。

例如a^b^c^c^b^a^c = a^a^b^b^c^c^c = 0^0^0^c = c(a, b, c代表任意整数)

代码如下:

#include <stdio.h>

int main()
{
    int n, m, present;
    while (scanf("%d", &n) && n)
    {
        present = 0;
        while (n--)
        {
            scanf("%d", &m);
            present ^= m;
        }
        printf("%d\n", present);
    }
    return 0;
}

 

 

刚开始做的时候用的是开数组的方法,因为英语不好,理解成你的礼物的号码是唯一的。结果内存”超标“,计算错误。当成教训吧,代码如下:

#include <stdio.h>

int present[1000010];

int main()
{
    int n, i, j, ok;
    while (scanf("%d", &n) && n)
    {
        for (i=0; i<n; i++)    //输入数据
            scanf("%d", &present[i]);
        for (i=0; i<n; i++)
        {
            ok = 0;    //present[i]与其他present相同的个数
            for (j=0; j<n; j++)
            {
                if (present[i] == present[j])
                {
                    ok++;
                    if (ok > 1)    //如果相同超过2个,提前结束
                        break;
                }
            }
            if (ok == 1)    //如果找到自己的present,结束循环
                break;
        }
        printf("%d\n", present[i]);
    }
    return 0;
}

 

 

posted on 2013-01-25 17:48  zm001  阅读(478)  评论(0编辑  收藏  举报