• hdu 2095 find your present (2)


    http://acm.hdu.edu.cn/showproblem.php?pid=2095

    要找出出现奇数次的数字,我使用了一种大概是归并的方法,相同的就把flag=!flag,不同的就往后继续一个,感觉有超时的可能但没想到更好的办法就试了下,没想到能AC了...囧

    代码如下:

     1 #include<stdio.h>
     2 #define MAX 10000
     3 struct Nu
     4 {
     5     int number;
     6     int flag;
     7 };
     8 int main()
     9 {
    10     int n;
    11     while(scanf("%d",&n)!=EOF&&n)
    12     {
    13         struct Nu a[MAX];
    14         int i,j,ad=0,x;
    15         for(i=0;i<n;i++)
    16         {
    17             scanf("%d",&x);
    18             for(j=0;j<ad;j++)
    19             {
    20                 if(a[j].number==x)
    21                 {
    22                   a[j].flag=!a[j].flag;
    23                   break;
    24                 } 
    25             }
    26             if(j==ad)
    27            {
    28                  a[ad].number=x;a[ad].flag=1; 
    29                  ad++;
    30               }
    31         }
    32         for(i=0;i<=ad;i++)
    33         {
    34             if(a[i].flag==1)
    35               printf("%d
    ",a[i].number);
    36         }
    37     }
    38 }

    后来上网搜了大神们的代码,大神都用异或运算来解决奇数的问题,正好学习下~

    异或运算法则:
    1. a ^ b = b ^ a
    2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
    3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
    4. a ^ b ^ a = b.
    利用法则四,可以把奇数项找出来。

     1 #include <stdio.h>  
     2 int main()  
     3 {  
     4     int a, n, b;  
     5     while(scanf("%d", &n), n)  
     6     {  
     7         a = 0;  
     8         while(n--)  
     9         {  
    10             scanf("%d", &b);  
    11             a ^= b;  
    12         }  
    13         printf("%d
    ", a);  
    14     }  
    15     return 0;  
    16 }  
  • 相关阅读:
    打包的@font-face包
    带你零基础入门redis【二】
    带你零基础入门redis【一】
    CentOS查找文件命令
    输入密码时提示大写锁定已打开
    JSP界面设置提示浮动框
    极光推送
    MySQL获取汉字的首字母
    mySQL函数根据经纬度计算两点距离
    js判断输入时间是否大于系统时间
  • 原文地址:https://www.cnblogs.com/xurenwen/p/3864864.html
Copyright © 2020-2023  润新知