欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c语言的全排列

程序员文章站 2022-03-25 16:16:14
在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧。估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了。如果你想出用一个循环使一个数字每一位都不相同,那么你就走进了死胡同,这种办法运算量巨大,往往到了高位就会超 ......

在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧。估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了。如果你想出用一个循环使一个数字每一位都不相同,那么你就走进了死胡同,这种办法运算量巨大,往往到了高位就会超时。所以就要使用算法(非递归类型)。
算法采用的是交换
递归其实也是一种交换

#include<stdio.h>
#include<windows.h>
int main()
{
int a[9],n,y=1,i,j,all,p=1,t,hi,ki,m,x;
int xiao_biao,temp,zhong;
printf("请输入位数最高9位\n");
scanf("%d",&n); 


for( i=0;i<n;i++){
a[i]=i+1;
printf("%d",a[i]);
}
printf("\n");
for(i=1;i<=n;i++){
p*=i;
}
all=1;
while(all<p){
for(i=n-1;i>0;i--){
if(a[i]>a[i-1]){xiao_biao=i-1;break;}
}
temp=a[xiao_biao];
for(t=xiao_biao+1;t<n;t++){
for(i=t;i<n;i++){
hi=a[t]-temp;
ki=a[i]-temp;
if(hi<=ki&&hi>0){
a[xiao_biao]=a[t];y=t;
}
}
}
a[y]=temp;
m=((n-1)-(xiao_biao))/2;
j=xiao_biao+1;
if((n-1)-(xiao_biao)==2){temp=a[n-1];a[n-1]=a[n-2];a[n-2]=temp;}
else if((n-1)-(xiao_biao)==3){temp=a[n-1];a[n-1]=a[n-3];a[n-3]=temp;}
else if((n-1)-(xiao_biao)==4||(n-1)-(xiao_biao)==5)x=2;
else if((n-1)-(xiao_biao)==6||(n-1)-(xiao_biao)==7)x=3;
else if((n-1)-(xiao_biao)==8||(n-1)-(xiao_biao)==9)x=4;
if((n-1)-(xiao_biao)==4||(n-1)-(xiao_biao)==5||(n-1)-(xiao_biao)==6||(n-1)-(xiao_biao)==7||(n-1)-(xiao_biao)==8||(n-1)-(xiao_biao)==9){ 
zhong=n;
for(i=0;i<x;i++){

    temp=a[zhong-1];
a[zhong-1]=a[j];
a[j]=temp;
zhong--;
j++;
}
zhong=n;
}

for( i=0;i<n;i++){
printf("%d",a[i]);
}

printf("\n");
all++; 
}
system("pause");
return 0;

}