鱼C论坛

 找回密码
 立即注册
查看: 37437|回复: 456

[技术交流] 一道有意思的C语言试题

  [复制链接]
发表于 2013-2-1 23:36:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:
void inplace_swap(int *x, int *y)
{
        *y = *x ^ *y;
        *x = *x ^ *y;
        *y = *x ^ *y;
}

void reverse_array(int a[], int count)
{
        int first, last;
        
        for( first=0, last=count-1; first <= last; first++, last-- )
        {
                inplace_swap(&a[first], &a[last]);
        }
}

以上代码段的作用是将数组a的元素头尾两端依次对调,那么有如下问题:

1. 解释下inplace_swap()利用异或能实现两数交换的原理?

2. 当数组中包含数字1,2,3,4时,代码可以正常运行,得到4,3,2,1。但如果数组中包含1,2,3,4,5时,你会发现结果是5,4,0,2,1。请问中间的0是从何而来的?

3. 对reverse_array的代码做哪些简单改动就能消除题目2存在的问题呢?


详细答案(回复可见):

游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-1 23:50:51 | 显示全部楼层
跟看那个不用第三个数交换一样神奇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 00:02:48 | 显示全部楼层
对答案啦!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 00:12:27 | 显示全部楼层
谢谢小甲鱼老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 00:17:17 | 显示全部楼层
A 二进制运算 B 感觉是因为数组奇偶性的问题 C 加多个判断~~~~感性认知 看下答案~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 02:16:17 | 显示全部楼层
B:是因为下标为2 时 x,y指向的内存是同一个,当执行第一条*y = *x ^ *y; 时,*x ^ *y = 0;将0赋值给*y那么*x的值也会被改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 09:27:57 | 显示全部楼层
1.利用了二进制运算(在零基础入门学习C语言64视频里有的)
2.因为 first==last 的时候,内存指向同一地址,*y = *x ^ *y就会等于0,相同的数异或都为0
3.修改first <= last为first < last就OK。
void inplace_swap(int *x, int *y)
{
        *y = *x ^ *y;
        *x = *x ^ *y;
        *y = *x ^ *y;
}

void reverse_array(int a[], int count)
{
        int first, last;
        
        for( first=0, last=count-1; first < last; first++, last-- )
        {
                inplace_swap(&a[first], &a[last]);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 09:42:58 | 显示全部楼层
膜拜了,学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 10:36:41 | 显示全部楼层
看下答案:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 15:53:48 | 显示全部楼层
这个要看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 15:57:14 | 显示全部楼层
好东西!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-2 16:48:01 | 显示全部楼层
3跟3自己异或。。坑啊。:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-4 21:27:10 | 显示全部楼层
看下答案啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-4 21:36:18 | 显示全部楼层
对答案哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-7 12:09:16 | 显示全部楼层
看看看看~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-7 12:41:38 | 显示全部楼层
开的就是结果暗暗啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-7 18:19:38 | 显示全部楼层
一道有意思的C语言试题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-11 08:28:00 | 显示全部楼层
1、能完成两个数的交换  保证了不会出现越界的问题
2、相同的两个数之间的异或得到的数是零   
3、在13行加判断  因为所给数列有序  所以只要判数是否相等就可以了
if (a[first]==a[last])
continue;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-15 13:51:50 | 显示全部楼层
学习         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-25 23:58:51 | 显示全部楼层
看答案啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表