排列组合数

  1 #include<stdio.h>
  2 #include<string.h>
  3 int a[10],m,n;
  4 
  5 //取数算法
  6 
  7 
  8 /*1、从m中选出n个全排列,从大到小,不允许重复
  9 
 10 3 2   输入
 11 
 12 32
 13 31
 14 21
 15 
 16 */
 17 void fun1(int m,int n)
 18 {
 19     int i,j;
 20     for(i=m;i>0;i--)
 21     {
 22         a[n]=i;
 23         if(n>1)
 24             fun1(i-1,n-1);
 25         else
 26         {
 27             for(j=a[0];j>0;j--)
 28                 printf("%d",a[j]);
 29             printf("\n");
 30         }
 31     }
 32 }
 33 
 34 
 35 /*2、从m中选出n个全排列,从大到小,允许重复
 36 
 37 3 2   输入
 38 
 39 33
 40 32
 41 31
 42 22
 43 21
 44 11
 45 
 46 */
 47 void fun2(int m,int n)
 48 {
 49     int i,j;
 50     for(i=m;i>0;i--)
 51     {
 52         a[n]=i;
 53         if(n>1)
 54             fun2(i,n-1);
 55         else
 56         {
 57             for(j=a[0];j>0;j--)
 58                 printf("%d",a[j]);
 59             printf("\n");
 60         }
 61     }
 62 }
 63 /*3、从m中选出n个全排列,从小到大,不允许重复
 64 
 65 3 2   输入
 66 
 67 12
 68 13
 69 23
 70 
 71 */
 72 void fun3(int u,int v)
 73 {
 74     int i,j;
 75     for(i=u;i<=m;i++)
 76     {
 77         a[v]=i;
 78         if(v<n)
 79             fun3(i+1,v+1);
 80         else
 81         {
 82             for(j=1;j<=a[0];j++)
 83                 printf("%d",a[j]);
 84             printf("\n");
 85         }
 86     }
 87 }
 88 /*4、从m中选出n个全排列,从小到大,允许重复
 89 
 90 3 2   输入
 91 
 92 11
 93 12
 94 13
 95 22
 96 23
 97 33
 98 
 99 */
100 void fun4(int u,int v)
101 {
102     int i,j;
103     for(i=u;i<=m;i++)
104     {
105         a[v]=i;
106         if(v<n)
107             fun4(i,v+1);
108         else
109         {
110             for(j=1;j<=a[0];j++)
111                 printf("%d",a[j]);
112             printf("\n");
113         }
114     }
115 }
116 
117 
118 // 给定一个数
119 
120 /*给定一个数求这个数的从小到大的全排列,不许重复
121 
122 3  输入
123 
124 123
125 132
126 213
127 231
128 312
129 321
130 */
131 void fun5(int u)
132 {
133     int i,j,ok;
134     if(u==m)
135     {
136         for(i=0;i<m;i++)
137             printf("%d",a[i]);
138         printf("\n");
139     }
140     else
141         for(i=1;i<=m;i++)  //for(i=m;i>0;i--)  即从大到小
142         {
143             ok=1;
144             for(j=0;j<u;j++)
145                 if(a[j]==i)
146                     ok=0;
147                 if(ok)
148                 {  
149                     a[u]=i;
150                     fun5(u+1);
151                 }
152         }
153 }
154 
155 /*给定一个数求这个数的从小到大的全排列,不许重复
156 2  输入
157 
158 11
159 12
160 21
161 22
162 
163 
164 */
165 void fun6(int u)
166 {
167     int i;
168     if(u==m)
169     {
170         for(i=0;i<m;i++)
171             printf("%d",a[i]);
172         printf("\n");
173     }
174     else
175         for(i=1;i<=m;i++)  //for(i=m;i>0;i--)  即从大到小
176         {
177                    a[u]=i;
178                     fun6(u+1);
179         }
180 }
181             
182 /*int main()
183 {
184     while(scanf("%d%d",&m,&n)!=EOF)
185     {
186         a[0]=n;
187         fun1(m,n);
188         fun2(m,n);
189         fun3(1,1);
190         fun4(1,1);
191     
192     }
193     return 0;
194 }*/
195 
196 int main()
197 {
198     while(scanf("%d",&m)!=EOF)
199         fun6(0);    
200     return 0;
201 }
posted @ 2012-11-27 15:05  萧凡客  阅读(344)  评论(0编辑  收藏  举报