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; }
上一篇: 【@PostConstruct注解研究】
下一篇: 详细解读:远程线程注入DLL到PC版微信