//利用递归实现全排列
void swap(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}
void printfPermutation(int Array[],int start,int length)
{
if(start == (length-1))
{
for(int i=0;i<length;i++)
cout<<Array[i];
cout<<endl;
return;
}
for(int j = start;j<length;j++)
{
swap(Array[j],Array[start]);
printfPermutation(Array,start+1,length);
swap(Array[j],Array[start]);
}
}
// 字典序来生成排列,这样生成的排列是按顺序的。
其实其关键在于 怎样按顺序找出一个排列项的下一个排列项 (这应该属于高中数学排列组合里面一个还比较难的问题)
设P是1~n的一个全排列:P = P1P2……Pn = P1P2……Pj-1PjPj+1……Pk-1PkPk+1……Pn
(1)从排列的最右端开始, 找出第一个比右边数字小的数字 的序号j(j从左端开始计算),即 j=max{i|pi
(2) 在Pj的右边的数字中,找出所有比Pj大的数中最小的数字Pk ,即 k=max{i|Pi>Pj}(右边的数从右至左是递增的,因此k是所有大于Pj的数字中序号最大者)
(3)对换Pj,Pk
(4)再将Pj+1……Pk-1PkPk+1Pn反转,即得到排列P的下一个排列。
举个例子:
void reverse(int Array[],int start,int length)
{
int first=start;
int last=length-1;
while(first<last)
{
int temp=Array[first];
Array[first++]=Array[last];
Array[last--]=temp;
}
}
void printfElement(int Array[],int length)
{
for(int i=0;i<length;i++)
cout<<Array[i];
cout<<endl;
}
void next_permutation(int Array[],int length)
{
if(Array==NULL||length<1)
return;
sort(Array,Array+length);
bool flag=true;
while(flag)
{
int i=length-1;
for(;0<i&&Array[i]<=Array[i-1];i--);
if(i==0)
flag=false;
else
{
int value=Array[i-1];
int j=length-1;
for(;i<=j&&Array[j]<=value;j--);
Array[i-1]=Array[j];
Array[j]=value;
}
reverse(Array,i,length);
printfElement(Array,length);
}
}
//递归实现exp
long long exp(int a,unsigned n)
{
if(n==1)
return a;
if(n%2==0)
return exp(a,n/2)*exp(a,n/2);
else
return a*exp(a,(n-1)/2)*exp(a,(n-1)/2);
}
double expResult(int a,int n)
{
if(n==0)
return 1;
if(a==0&& n<0)
throw exception("this is inValid");
int m=n;
if(n<0)
m=-n;
long long result=exp(a,m);
if(n<0)
return 1.0/result;
else
return result;
}
int main()
{
//int Array[4]={9,6,7,5};
//printfPermutation(Array,0,4);
//next_permutation(Array,4);
cout<<expResult(2,-3);
system("PAUSE");
return 0;
}
void swap(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}
void printfPermutation(int Array[],int start,int length)
{
if(start == (length-1))
{
for(int i=0;i<length;i++)
cout<<Array[i];
cout<<endl;
return;
}
for(int j = start;j<length;j++)
{
swap(Array[j],Array[start]);
printfPermutation(Array,start+1,length);
swap(Array[j],Array[start]);
}
}
// 字典序来生成排列,这样生成的排列是按顺序的。
其实其关键在于 怎样按顺序找出一个排列项的下一个排列项 (这应该属于高中数学排列组合里面一个还比较难的问题)
设P是1~n的一个全排列:P = P1P2……Pn = P1P2……Pj-1PjPj+1……Pk-1PkPk+1……Pn
(1)从排列的最右端开始, 找出第一个比右边数字小的数字 的序号j(j从左端开始计算),即 j=max{i|pi
(2) 在Pj的右边的数字中,找出所有比Pj大的数中最小的数字Pk ,即 k=max{i|Pi>Pj}(右边的数从右至左是递增的,因此k是所有大于Pj的数字中序号最大者)
(3)对换Pj,Pk
(4)再将Pj+1……Pk-1PkPk+1Pn反转,即得到排列P的下一个排列。
举个例子:
例如839647521是数字1~9的一个排列。从它生成下一个排列的步骤如下:
自右至左找出排列中第一个比右边数字小的数字4 839647521
在该数字后的数字中找出比4大的数中最小的一个5 839647521
将5与4交换 839657421
将7421倒转 839651247
所以839647521的下一个排列是839651247。
void reverse(int Array[],int start,int length)
{
int first=start;
int last=length-1;
while(first<last)
{
int temp=Array[first];
Array[first++]=Array[last];
Array[last--]=temp;
}
}
void printfElement(int Array[],int length)
{
for(int i=0;i<length;i++)
cout<<Array[i];
cout<<endl;
}
void next_permutation(int Array[],int length)
{
if(Array==NULL||length<1)
return;
sort(Array,Array+length);
bool flag=true;
while(flag)
{
int i=length-1;
for(;0<i&&Array[i]<=Array[i-1];i--);
if(i==0)
flag=false;
else
{
int value=Array[i-1];
int j=length-1;
for(;i<=j&&Array[j]<=value;j--);
Array[i-1]=Array[j];
Array[j]=value;
}
reverse(Array,i,length);
printfElement(Array,length);
}
}
//递归实现exp
long long exp(int a,unsigned n)
{
if(n==1)
return a;
if(n%2==0)
return exp(a,n/2)*exp(a,n/2);
else
return a*exp(a,(n-1)/2)*exp(a,(n-1)/2);
}
double expResult(int a,int n)
{
if(n==0)
return 1;
if(a==0&& n<0)
throw exception("this is inValid");
int m=n;
if(n<0)
m=-n;
long long result=exp(a,m);
if(n<0)
return 1.0/result;
else
return result;
}
int main()
{
//int Array[4]={9,6,7,5};
//printfPermutation(Array,0,4);
//next_permutation(Array,4);
cout<<expResult(2,-3);
system("PAUSE");
return 0;
}