算法设计:小技巧汇总
2014-08-20 21:47
295 查看
1 找出两个数中的最大数:
2 求两个数的平均数:
3 查看数x的二进制中1的个数
4 不使用临时变量交换两个值
交换函数swap是经常用到的函数,小巧简单,以下两种实现方式都不需要使用临时变量:
以上的swap函数,尤其是第2个实现,简洁美观高效,乃居家旅行必备良品。但是, 使用它们之前一定要想一想,你的程序中,是否有可能会让swap中的两个形参引用同一变量。 如果是,那么上述两个swap函数都将出问题。有人说,谁那么无聊去swap同一个变量。 那可不好说,比如你在操作一个数组中的元素,然后用到了以下语句:
你并没有注意到swap会去操作同一变量,可是当i等于j时,就相当于你这么干了。 然后呢,上面两个实现执行完第一条语句后,操作的那个内存中的数就变成0了。 后面的语句不会起到什么实际作用。
所以如果程序中有可能让swap函数去操作同一变量,就老老实实用最朴素的版本:
原文地址:http://www.cricode.com/2442.html
5 写一个函数返回两个数中的较大者,不能使用if-else及任何比较操作符。
原文地址:http://www.cricode.com/2447.html
6 写一个Add函数求两个数的和,不能使用+号或其它算术运算符。
原文地址:http://www.cricode.com/2513.html
int biggerFunc(int a, int b) { return ( ( a +b ) + abs( a - b ) ) / 2; }
2 求两个数的平均数:
/* * 1、x & y, 求两个数的二进制下的相同位的和的一半: * eg : 1 & 1 = 1; 0 & 0 = 0; 可以看出的确是一半 * 2、x ^ y, 求两个数的二进制下的不同位的和: eg: 1 ^ 0 = 1 * 3、 >> 1, 除以2 * 4、 所以整个表达式的结果就是将(x+y)/2 */ int averageFunc(int x, int y) { return (x & y) + ((x ^ y) >> 1); }
3 查看数x的二进制中1的个数
int func(x) { int countx = 0; while(x) { countx ++; x = x & ( x - 1 ); } return countx; }
4 不使用临时变量交换两个值
a ^= b; b ^= a; a ^= b; //或者 a ^= b ^= a ^= b; //一般做法如下,使用临时变量。 int t = a; a = b; b = t; //可以用于指针和浮点值, 而不象 XOR 技巧只能用于整型
交换函数swap是经常用到的函数,小巧简单,以下两种实现方式都不需要使用临时变量:
123456789101112 | // 实现1void swap(int &a, int &b){ b = a - b; a = a - b; b = a + b;}// 实现2void swap(int &a, int &b){ a = a ^ b; b = a ^ b; a = a ^ b;} |
1 2 | swap(a[i],a[j]);// i==j时,出问题 |
所以如果程序中有可能让swap函数去操作同一变量,就老老实实用最朴素的版本:
voidswap(int&a,int&b){ int tmp=a; a=b; b=tmp; }
原文地址:http://www.cricode.com/2442.html
5 写一个函数返回两个数中的较大者,不能使用if-else及任何比较操作符。
If a > b, return a; else, return b. If (a - b) < 0, return b; else, return a. If (a - b) < 0, 令k = 1; else, 令k = 0. return a - k * (a - b). 令z = a - b. 令k是z的最高位,return a - k * z.
#include <iostream> using namespace std; int Max1(int a, int b){ int c[2] = { a, b }; int z = a - b; z = (z>>31) & 1; return c[z]; } int Max2(int a, int b){ int z = a - b; int k = (z>>31) & 1; return a - k * z; } int main(){ int a = 5, b = 10; cout<<Max1(a, b)<<endl; cout<<Max2(a, b)<<endl; return 0; }
原文地址:http://www.cricode.com/2447.html
6 写一个Add函数求两个数的和,不能使用+号或其它算术运算符。
int Add2(int a, int b){ if(b == 0) return a; int sum = a ^ b; // 各位相加,不计进位 int carry = (a & b) << 1; // 记下进位 return Add2(sum, carry); // 求sum和carry的和 } int Add3(int a, int b){ while(b != 0){ int sum = a ^ b; int carry = (a & b) << 1; a = sum; b = carry; } return a; } int Add1(int a, int b){ char *c = (char*)a; return (int)&c[b]; // c+sizeof(char)*b=a + b }
原文地址:http://www.cricode.com/2513.html
相关文章推荐
- C++算法设计技巧
- 【算法复习三】算法设计技巧与优化----各种背包问题总结
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——矩阵连乘问题
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——拿石头游戏
- 【算法】算法设计技巧
- (算法设计技巧与分析)LinearSearch
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——平面最近点对
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码
- 数据结构与算法分析(六)——算法设计技巧
- 【算法复习三】算法设计技巧与优化----算法设计技巧
- 算法设计技巧与分析
- 算法设计技巧
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Strassen矩阵乘法
- 常用算法设计技巧
- 【算法复习三】算法设计技巧与优化----各种背包问题总结
- 【算法复习三】算法设计技巧与优化----算法设计技巧之中位数
- 设计技巧1:策略模式 Strategy 把整个算法替换掉
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——收费站重建问题
- 算法设计技巧--离散暴力将时间将为O(0);