| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1691 人关注过本帖, 2 人收藏
标题:很有趣的一道题,出乎意料的答案
只看楼主 加入收藏
ouyangouyang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:579
注 册:2009-10-8
收藏
得分:0 
谁写一个完整的程序看一看啊

多少恨, 昨夜梦魂中。 还似旧时游上苑, 车如流水马如龙; 花月正春风!
2012-03-12 12:57
ljk694145447
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:114
注 册:2011-11-29
收藏
得分:0 
怎么算出来的?还是不明白呢
2012-03-12 14:39
ljk694145447
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:114
注 册:2011-11-29
收藏
得分:0 
大概知道了
2012-03-12 14:47
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
二楼已经基本上就是第一问完整的代码了,写个c语言版

程序代码:
#include <stdio.h>

int main()
{
    int ans=0,total,tmp;
    scanf("%d",&total);
    while (total--) ans^=(scanf("%d",&tmp),tmp);
    printf("%d\n",ans);
}


大家看看第二问怎么做哦
2012-03-12 14:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
有意思的问题。不过我没想到在空间复杂度O(1)下能达到时间复杂度O(n)的算法。只能做到O(n*log(n))

重剑无锋,大巧不工
2012-03-12 18:58
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 15楼 beyondyf
也分享下be
2012-03-12 19:18
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
算了,我在这里先把代码贴出来,看谁能看出第二问是怎样根据第一问基础稍加改变得到的
程序代码:
#include <stdio.h>
#define Nmax 1000000

int n,ans,ans1,ans2,a[Nmax],i,p;

int main()
{
    scanf("%d",&n);
    for (i=0; i<n; i++) scanf("%d",&a[i]);
    ans=0;  for (i=0; i<n; i++) ans^=a[i];
    p=1<<30;  while ((p&ans)==0) p>>=1;
    ans1=0; ans2=0;
    for (i=0; i<n; i++)
    if (a[i]&p) ans1^=a[i]; else ans2^=a[i];
    printf("%d %d\n",ans1,ans2);
    
    system("pause");
}
    
2012-03-13 17:42
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
呵呵,确实很巧妙。首先仍是获得这两个奇次出现的数(设为A和B吧,方便下面的叙述)的异或值ans。
下一步有意思,找到A和B不同的一位P。这个很重要。因为A和B在这一位上各出现奇数次,而A、B是不相等的。所以这一位1只属于其中一个,不会A、B同时在这一位上为1。其它出现偶数次的数不需要考虑,在之后的异或中会被抵消掉。
之后将这一位为1的数异或在一起为ans1,这一位为0的数异或在一起ans2。这样就将两个出现奇数次的数分离到了两个集合里。
ans1、ans2里各包含一个出现奇次的数。异或后的数就是这两个了。

确实不错。关于这个不同位的找法小曹是从高到低找的。也可以从低到高找,这都无所谓,找到一个在ans中为1的位那必然是A、B互不相同的位。

纠正一下BianChengNan。这里的数可以是任何类型的数,float、double并不影响这一算法的应用。原因,只要是二进制的数就可以,而计算机里有什么数不是二进制的呢?

重剑无锋,大巧不工
2012-03-13 19:44
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
算法整体很漂亮,就是求p的过程朴素了点。送个比较炫的,这样就更完美了

p = ans - (ans & ans - 1);

重剑无锋,大巧不工
2012-03-13 21:55
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 19楼 beyondyf
哇塞,这个取最低位真心pl
2012-03-13 22:16
快速回复:很有趣的一道题,出乎意料的答案
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042270 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved