zoukankan      html  css  js  c++  java
  • 数的全排列

    一、全排列概念

    从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
    ",a,b,c,d,e);
    20     finish = clock();
    21     printf("总耗时:%.5fs
    ",(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
    ",a[1],a[2],a[3],a[4],a[5]);
    28                         }        
    29                     }
    30                         
    31     finish = clock();
    32     printf("总耗时:%.5fs
    ",(finish-start)/1000);
    33     return 0;
    34 }

    运行结果:

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

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

  • 相关阅读:
    windows server 2003打补丁升级后,网站上的aspx页面打不开的解决办法
    为什么IM还有生存空间
    CTO俱乐部深圳:移动互联网发展与趋势 活动分享
    为word文档创建文档结构图的的步骤
    面试官面试总结
    dll与exe通信的VC++程序实例源码
    openfire的集群研究
    如何有效地记忆与学习
    How The Kernel Manages Your Memory
    C语言循环小技巧
  • 原文地址:https://www.cnblogs.com/guohaoblog/p/9257231.html
Copyright © 2011-2022 走看看