数的全排列

一、全排列概念

从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为n!,通过乘法原理可以得到。

比如:123的全排列是123、132、213、231、312、321     本文用暴力算法求解5个数的全排列,更好的优化算法,见后续博文

二、代码

法一

 1 #include <stdio.h>
 2 #include <time.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     // 对5个数 进行全排列 
 7     int a,b,c,d,e;
 8     float start,finish;
 9     start = clock();
10     for(a=1;a<=5;++a)
11         for(b=1;b<=5;++b)
12             for(c=1;c<=5;++c)
13                 for(d=1;d<=5;++d)
14                     for(e=1;e<=5;++e)
15                         if(a!=b && a!=c && a!=d && a!=e
16                                 && b!=c && b!=d && b!=e
17                                          && c!=d && c!=e
18                                                 && d!=e)
19                             printf("%d%d%d%d%d\n",a,b,c,d,e);
20     finish = clock();
21     printf("总耗时:%.5fs\n",(finish-start)/1000);
22     return 0;
23 }

运行结果:

法二、

 1 #include <stdio.h>
 2 #include <time.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     // 对5个数 进行全排列 
 7     int a[6];  // 存放5位数 
 8     int sum,flag[6],i;
 9     float start,finish;
10     start = clock();
11     for(a[1]=1;a[1]<=5;++a[1])
12         for(a[2]=1;a[2]<=5;++a[2])
13             for(a[3]=1;a[3]<=5;++a[3])
14                 for(a[4]=1;a[4]<=5;++a[4])
15                     for(a[5]=1;a[5]<=5;++a[5])
16                     {
17                         for(i=1;i<=5;++i)  // 初始化flag数组 
18                             flag[i] = 0; 
19                         for(i=1;i<=5;++i)    // 如果某个数出现过就标记一下
20                             flag[a[i]]=1;
21                         sum = 0;    
22                         for(i=1;i<=5;++i)     
23                             sum += flag[i];    
24                         // 如果恰好出现了5个不同的数,并且满足条件,则输出
25                         if(sum==5)
26                         {
27                             printf("%d%d%d%d%d\n",a[1],a[2],a[3],a[4],a[5]);
28                         }        
29                     }
30                         
31     finish = clock();
32     printf("总耗时:%.5fs\n",(finish-start)/1000);
33     return 0;
34 }

运行结果:

第二种方法在第一种的思路上,多了一个标记,这样在if语句中少做一些比较,节约时间

关于更高的效率,后续博文继续探讨

猜你喜欢

转载自www.cnblogs.com/guohaoblog/p/9257231.html
今日推荐