c語言的全排列
阿新 • • 發佈:2019-05-11
交換 c語言 \n 歸類 個數 使用 pre system 語言
在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; }
c語言的全排列