求幂,全排列基本算法

来源:互联网 发布:个人卖数据 编辑:程序博客网 时间:2024/05/22 00:29

看这些算法很费,用了两个多小时

1 全排列:迭代思想,未考虑重复元素

#include <iostream>using namespace std;void Swap(char* a,char* b){char c;c = *a;*a = *b;*b = c;}/*全排列思想:1)2个数全排列 ab ba,即第一个数与后面的数交换。      视a不动,则bc排列 abc  acb   2)迭代:把最后两个数交换,前面其他的数看成一个数。 a 与b交换后,视b不动 bac bca ;a与c交换后视c不动, cba cab */// 第m个数,共有len个数void allRange(char* pstr,int m, int len){static int s_i=1;if( m == len ){printf("%3d: %s\n",s_i++,pstr);}else{for(int i=m;i<len ;i++)//必须是i<=len????{Swap(pstr+m,pstr+i);allRange(pstr,m+1,len);Swap(pstr+m,pstr+i);}}}void foo(char* pstr){allRange(pstr,0,strlen(pstr));//前面不能加void!!!,第一个数编号为0!!!}int main(){char str[]="abcd"; //使用字符数组,不是指针!!!cout<<"len: "<<strlen(str)<<endl;foo(str);return 0;}


2 求幂

#include <iostream>using namespace  std;int power1(int x,int n){int result = 1;while(n--){result=result*x;  //不是x=x*x;未考虑零次幂}return result;}/*--------------------- 递归二分法实现阶乘------------------------*/int power2(int x,int n){if(0 == n){return 1;}else if(1 == n){return x;}else{if(n%2 ==1 ){return power2(x,n/2)*power2(x,n/2)*x;//要返回函数,奇数次幂要多乘一个x}else{return power2(x,n/2)*power2(x,n/2);}}}/*-------------------------非递归的二分法-----------------------------*//*x^23写成x^16 * x^4* x^2 * x,即23=16+4+2+1,而23 = 10111(二进制),所以只要将n化为二进制并由低位到高位依次判断如果第i位为1,则result *=x^(2^i)*/int power3(int x, unsigned int n){if (n == 0)return 1;int result = 1;while (n != 0){//if ((n & 1) != 0)if(n%2 !=0)//判断是否需要为奇数result *= x;x *= x;n >>= 1;}return result;}/*---------------------------------改进非递归二分法------------------如像48=110000(二进制)这种低位有很多0的数,可以先过滤掉低位的0再进行计算,这样也会提高一些效率*///计算x^n  by MoreWindows( http://blog.csdn.net/MoreWindows )int power4(int x, unsigned int n){if (n == 0){return 1;}else{while ((n & 1) == 0){n >>= 1;x *= x;}}int result = x;n >>= 1;while (n != 0){x *= x;if ((n & 1) != 0)result *= x;n >>= 1;}return result;}int main(){int x=10,n=4,result=0;result = power4(x,n);cout<<x<<"^"<<n<<"="<<result<<endl;return 0;}

3参考 http://blog.csdn.net/column/details/stl-morewindows.html

0 0
原创粉丝点击