实现两个整数交换
2010-11-28 15:58
211 查看
晚上他们参加完网龙的笔试回来,我问了考的题目。
整体感觉很侧重基础,而且又要求有主观想法。
第一个编程题是:用 C 语言写一个函数交换两整数的值,不借助第三个变量。
事实上这个题目一听到就有了想法,因为以前有做过,形如:
(方法一:)
a = a + b;
b = a - b;
a = a - b;
不过提出了最大的问题,就是两个正数的溢出问题。这个确实是缺限,以前遇到却没去找它的解决方法。
此时提出了强转类型为long int再做计算的想法(这时因为在想前面的问题没听懂)
然后基于这个想法提出了直接强转 double 运算完再转回 int,不过方法不可行
因为总需要将中间结果写到整型的a或b中,一样存在溢出的事实。
但大脸又提出了他的解法:
(方法二:)
a = a - b;
b = a + b;
a = b - a;
这方法以前决对没想过,原因在于方法一是从别的地方看到的,而非自己做出来的,没有解题过程的思维
乍一看,不存在两正数溢出的情况,不过在讨论中发现还是存在溢出的情况:一正数与一负数。
然后换了题目讨论而没有继续研究,直到过来问我他们的笔试题,我把知道的和他说了一下。
说到这题目时我把讨论的情况说了一下,不过说的过程中我发现了之前忽略的问题:
用方法一的话,溢出的可能性存在于:
1.两正数的交换
2.两负数的交换
即同号
于是又想了方法二,发现溢出的可能性存在于:
1.一正一负的交换
即异号
就这样综合一下得到了答案:
void swap(int *a, int *b){
if ((*a > 0 && *b > 0) || (*a < 0 && *b < 0)){ //同号
*a = *a - *b;
*b = *a + *b;
*a = *b - *a;
}
else { //异号
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
}
现在看来,其实这个并不难想到,只是发现自己解决问题时太依赖经验思维
尤其是对于认为简单的事情往往都没有换个角度进行思考,错失发现潜在事实的机会
这应该就是晚上的收获了。。
补充:睡觉前搜到这个东西,看了又无语了一次,相同的思维方式的另一个结果
void swap(int *a, int *b){
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}
http://hi.baidu.com/falcon_mao/blog/item/e9b131023138e6094bfb51bb.html
整体感觉很侧重基础,而且又要求有主观想法。
第一个编程题是:用 C 语言写一个函数交换两整数的值,不借助第三个变量。
事实上这个题目一听到就有了想法,因为以前有做过,形如:
(方法一:)
a = a + b;
b = a - b;
a = a - b;
不过提出了最大的问题,就是两个正数的溢出问题。这个确实是缺限,以前遇到却没去找它的解决方法。
此时提出了强转类型为long int再做计算的想法(这时因为在想前面的问题没听懂)
然后基于这个想法提出了直接强转 double 运算完再转回 int,不过方法不可行
因为总需要将中间结果写到整型的a或b中,一样存在溢出的事实。
但大脸又提出了他的解法:
(方法二:)
a = a - b;
b = a + b;
a = b - a;
这方法以前决对没想过,原因在于方法一是从别的地方看到的,而非自己做出来的,没有解题过程的思维
乍一看,不存在两正数溢出的情况,不过在讨论中发现还是存在溢出的情况:一正数与一负数。
然后换了题目讨论而没有继续研究,直到过来问我他们的笔试题,我把知道的和他说了一下。
说到这题目时我把讨论的情况说了一下,不过说的过程中我发现了之前忽略的问题:
用方法一的话,溢出的可能性存在于:
1.两正数的交换
2.两负数的交换
即同号
于是又想了方法二,发现溢出的可能性存在于:
1.一正一负的交换
即异号
就这样综合一下得到了答案:
void swap(int *a, int *b){
if ((*a > 0 && *b > 0) || (*a < 0 && *b < 0)){ //同号
*a = *a - *b;
*b = *a + *b;
*a = *b - *a;
}
else { //异号
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
}
现在看来,其实这个并不难想到,只是发现自己解决问题时太依赖经验思维
尤其是对于认为简单的事情往往都没有换个角度进行思考,错失发现潜在事实的机会
这应该就是晚上的收获了。。
补充:睡觉前搜到这个东西,看了又无语了一次,相同的思维方式的另一个结果
void swap(int *a, int *b){
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}
http://hi.baidu.com/falcon_mao/blog/item/e9b131023138e6094bfb51bb.html
相关文章推荐
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 实现两个整数值的交换(无中间变量)
- 【C】写一个宏将一个数字的奇数位和偶数位交换。实现两个int(32位)整数m和n的二进制表达中,位(bit)不同的个数
- 不使用中间变量实现两个整数的交换
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 如何实现两个整数类型的数字交换
- 利用C语言来实现交换两个变量的值,由终端输入两个整数给变量x、y,然后交换x和y的值后,输出x和y。 有不同的方法
- 利用位操作符实现两个整数的交换
- 不用辅助变量实现两个整数之间值的交换
- 指针学习:指针变量作为函数参数实现交换两个整数
- 不使用第三个变量实现两个整数之间的交换
- 实现两个整数变量的交换
- 面试题 :实现两个整数变量的交换
- 异或运算实现两个整数的交换
- 实现两个整数交换总结
- 《编程之美 》2.1 位运算实现—交换两个整数、求和、整数的二进制表达中1的个数
- 不使用中间变量实现两个整数的交换(方法一)
- 一行语句不越界实现交换两个整数
- 浅谈关于两个整数的交换函数的N种实现方式
- Java实现两个整数变量的交换