求助:不用中间变量,如何将变量a和b的值进行交换???
不用中间变量,如何将变量a和b的值进行交换??? 问题点数:20、回复次数:59Top
1 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-11-10 15:25:46 得分 0
__asm
{
push a
push b
pop a
pop b
}Top
2 楼cy2005abc(天空与草原)回复于 2006-11-10 15:30:18 得分 0
a=a^b;
b=a^b;
a=a^b;Top
3 楼yuanhan530(千年※ 蜗牛)回复于 2006-11-10 15:31:10 得分 0
a=a+b;
b=a-b;
a=a-b;
~~~~~~~~~~~`
Top
4 楼cy2005abc(天空与草原)回复于 2006-11-10 15:31:43 得分 0
a=a+b;
b=a-b;
a=a-b;Top
5 楼zx_hxp_jw(耗子)回复于 2006-11-10 15:32:22 得分 0
int a,b;
a = a + b;
b = a - b;
a = a - b;Top
6 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:33:45 得分 0
二楼算正解
一楼有点牵强
还有可以通过 a = a+b
b= a-b
a= a-b
这种方式,内存有溢出
但是溢出两次抵消了Top
7 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:34:11 得分 0
异或运算,加减运算都对Top
8 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:34:33 得分 0
雁南飞:雁无留踪之意,水无取影之心Top
9 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-10 15:36:32 得分 0
a=a^b;
b=a^b;
a=a^b;
用加减法一旦溢出就over了,因为不知道变量的类型,用嵌套汇编的方法也不好。Top
10 楼mmqmjy(莫名其妙)回复于 2006-11-10 15:38:11 得分 0
一楼的,堆栈不属于变量的吗
你还一用就用了俩Top
11 楼malligator(十步之内没有我的爱人)回复于 2006-11-10 15:39:26 得分 0
swap1(int* a, int *b) //同意
{
a=a^b;
b=a^b;
a=a^b;
}
swap2(int* a, int *b) //数大于二分之一MAX_INT时会溢出
{
a=a+b;
b=a-b;
a=a-b;
}Top
12 楼leonkiros2004(风塑幻想[猪头也当家])回复于 2006-11-10 16:29:07 得分 0
^
这个是什么意思啊~高手解释一下呗~Top
13 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-10 16:32:57 得分 0
异或
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
1 ^ 1 = 0Top
14 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-11-10 16:43:30 得分 0
to mmqmjy(莫名其妙)
堆栈是堆栈,变量是变量
不同概念的东西,你要硬说一样,那用寄存器总行了吧
_asm
{
pusha
mov eax,a
mov ebx,b
mov a,ebx
mov b,eax
popa
}Top
15 楼guohui4321(<看看海吹吹风>)回复于 2006-11-10 16:56:06 得分 0
a = a^b^(b=a);Top
16 楼dengyiwolf(七星偃月刀)回复于 2006-11-10 17:56:20 得分 0
用异或运算,
a=a^b;
b=a^b;
a=a^b;Top
17 楼wxspll(HDU)回复于 2006-11-10 18:00:43 得分 0
a ^= b ^= a ^= b;Top
18 楼wswqwps(孔子曰:打架用砖乎,不宜乱乎,照头乎,乎不死再乎.佛说:胡扯,我佛慈悲,不亦多乎,一砖乎死,减轻痛苦)回复于 2006-11-10 18:33:59 得分 0
a=a^b;
b=a^b;
a=a^b;
----------
没有可移植性Top
19 楼phommy(石头,竹子,诗)回复于 2006-11-10 18:42:36 得分 0
b=(a,a=b);
逗号运算是左结合的,先计算a的值,然后才赋值,()里的值为a
没调试过~_~Top
20 楼ChrisAK(LOLICON)回复于 2006-11-10 19:06:06 得分 0
_asm
{
mov eax,a
xchg eax,b
mov a,eax
}Top
21 楼smartcatiboy()回复于 2006-11-10 19:09:10 得分 0
数学上,不可能无中间变量交换
楼主就别做梦了
push也好,别的也好,其实还是变量Top
22 楼fatminforever(春臆居)回复于 2006-11-10 19:27:32 得分 0
楼上请仔细看回帖,鉴定完毕
这是道好老的编程题了,只用加减法就可以了,其他方法都是殊途同归
Top
23 楼noelo()回复于 2006-11-10 19:30:36 得分 0
a = a + b;
b = a - b;
a = a - b;Top
24 楼goldendreams(快乐生活)回复于 2006-11-10 20:15:29 得分 0
int a,b;
a = a + b;
b = a - b;
a = a - b;以前见过Top
25 楼richard_ma(中子星)回复于 2006-11-10 20:49:34 得分 0
a=a^b;
b=a^b;
a=a^b;
----------
没有可移植性
-----------------------------------------------
这个是为什么啊?在不同的编译器下异或运算实现不同吗?Top
26 楼begtostudy(我的CSDN博客:http://blog.csdn.net/begtostudy/)回复于 2006-11-10 20:53:38 得分 0
菜鸟问一句
a=a^b;
b=a^b;
a=a^b;
和用中间变量比,那个效率高呢?Top
27 楼gare1000(一夜也痴情/爱钻裙子)回复于 2006-11-10 21:36:45 得分 0
在net下:
a=a.tostring&b.tostring
b = a.trim(b.tostring)
a = a.trim(b.tostring)
备注:a、b 为数值和字符类型Top
28 楼sdp(雨尘)回复于 2006-11-10 22:02:09 得分 0
a=a^b;
b=a^b;
a=a^b;
记得在以潭浩强书上见过,不过没有什么必要.呵呵
现在的硬件方面没有什么问题了,好的可读性是比较重要的.Top
29 楼IlikeEnglish()回复于 2006-11-10 22:35:07 得分 0
b=(a+b)-(a=b)Top
30 楼IlikeEnglish()回复于 2006-11-10 22:35:35 得分 0
b=(a+b)-(a=b)Top
31 楼IlikeEnglish()回复于 2006-11-10 22:35:43 得分 0
b=(a+b)-(a=b)Top
32 楼BKgHost(黑色幽灵)回复于 2006-11-10 22:39:48 得分 0
加减法最符合要求,因为他完全是利用了数学原理,是个小算法,比异或高明,但是异或也是利用
电路计算方法,这个问题经典!Top
33 楼brucesea(可口可乐)回复于 2006-11-10 22:56:28 得分 0
用+-有溢出问题,
直接用^,当a,b是相同内存单元时结果就不对,得到都为0
修改一下:
#define swap(a, b) ( (a==b) || ((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))Top
34 楼smallbird3()回复于 2006-11-10 23:02:58 得分 0
a=(a+b)/2;
b=a-b;
a=a-b;
b=2*a+b;
Top
35 楼myjerry(网络猎人)回复于 2006-11-10 23:06:07 得分 0
长见识了!Top
36 楼yuanchuang(元创)回复于 2006-11-10 23:08:38 得分 0
以前也喜欢看这种类型的问题,但是现在想不明白,这有什么意义,呵呵Top
37 楼left_zxp(专逃课的左手)回复于 2006-11-10 23:12:07 得分 0
cy2005abc() 正解Top
38 楼redleaves(程序员)回复于 2006-11-10 23:20:38 得分 0
汇编有xchg指令...Top
39 楼szto2003(dotnet)回复于 2006-11-10 23:25:03 得分 0
a=a+b;
b=a-b;
a=a-b;Top
40 楼YuLimin(阿敏总司令:简单就是美—钻石闪闪您快结贴!)回复于 2006-11-10 23:25:55 得分 0
记得是2001年网络程序员的考题。。。Top
41 楼softboysxp(fiNAL.Y)回复于 2006-11-10 23:56:41 得分 0
b = a + b - (a = b)Top
42 楼BAYERN(我有个愿望-要把月亮踹成直的,把太阳捏成方的)回复于 2006-11-11 08:55:05 得分 0
揭贴吧Top
43 楼HoBoss(学徒)回复于 2006-11-11 09:19:33 得分 0
a=a^b;
b=a^b;
a=a^b;
我记得也是用这个,因为用加减法会有溢出的问题
Top
44 楼whypp(绝望生鱼片)回复于 2006-11-11 09:46:52 得分 0
用异或.但是java下不行Top
45 楼luora()回复于 2006-11-11 10:18:41 得分 0
swap1(int* a, int *b) {
a=a^b;
b=a^b;
a=a^b;
}//同意这个,这样可以避免发生溢出错误
Top
46 楼tianhua(网络过客)回复于 2006-11-11 11:04:50 得分 0
a=a+b
b=a-b
a=a-bTop
47 楼freeman868(回头浪子 ^ - ^)回复于 2006-11-11 11:10:50 得分 0
void swap1(int* a, int* b)
{
*a = (*a)^(*b);
*b = (*a)^(*b);
*a = (*a)^(*b);
}
void swap2(int& a, int& b)
{
a = a^b;
b = a^b;
a = a^b;
}
void swap3(int* a, int* b)
{
*a = (*a)+(*b);
*b = (*a)-(*b);
*a = (*a)-(*b);
}
void swap4(int& a, int& b)
{
a = a+b;
b = a-b;
a = a-b;
}
void main()
{
int A = 10, B = 99;
swap1(&A, &B);
printf("A: %d\nB: %d\n", A, B);
swap2(A, B);
printf("A: %d\nB: %d\n", A, B);
swap3(&A, &B);
printf("A: %d\nB: %d\n", A, B);
swap4(A, B);
printf("A: %d\nB: %d\n", A, B);
}Top
48 楼YUNSHI0123(叶子的离去,是因为风的追求,还是树的不挽留?)回复于 2006-11-11 11:30:02 得分 0
a = a^b;
b = a^b;
a = a^b;Top
49 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:39:06 得分 0
a=a^b^a^b;Top
50 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:40:01 得分 0
错了
a=a^=b^=a^=b;Top
51 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:44:28 得分 0
有错了 呵呵
a^=b^=a^=b;Top
52 楼hyg2008(蓝色雨)回复于 2006-11-11 12:19:51 得分 0
楼上的全部错了!
看看下面这样会出什么问题?
int mian()
{
int a;
pa = &a;
pb = &a;
swap(pa, pb);
reurn 0;
}
所以在swap里面还应该检查pa和pb是否相等。Top
53 楼viornment()回复于 2006-11-11 12:20:39 得分 0
楼上的解法本来就容易犯错误,呵呵!
Top
54 楼hyg2008(蓝色雨)回复于 2006-11-11 12:20:44 得分 0
上面少定义了pa,明白意思就行了Top
55 楼zerohk(零度空间)回复于 2006-11-11 14:22:50 得分 0
顶者有分Top
56 楼thinkSJ()回复于 2006-11-11 17:14:05 得分 0
应该是可以用栈或寄存器的Top
57 楼lujun5100(笑笑)回复于 2006-11-11 17:48:03 得分 0
不错
楼上有很多都是错地,大家要自己验证一下
不要被别人弄糊涂了Top
58 楼kelvin_yin(康熙)回复于 2006-11-11 18:02:48 得分 0
弱弱的问一句:这种问题在实际应用中有什么作用?Top
59 楼LifeAndC(蓝色忧郁)回复于 2006-11-11 18:17:52 得分 0
这样的单位不用去了。Top




