⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quanpailie.c

📁 此程序完成全排列问题
💻 C
字号:
#include<stdio.h>       /*这两个库函数是习惯性的加上去的*/
#include<stdlib.h>  
#define ISPRINT           /*是否打印结果的标志*/
#define MAX 200             /*最大的数*/
unsigned int *_NUM;          /*用于存放一条结果的数组指针*/
char *_NUMFLAG;             /*用于存放是否已经使用的标志*/
#define NUM(j) (*(_NUM+(j)))            /*第j位的数字*/
#define NUMFLAG(j) (*(_NUMFLAG+(j)))       /*数字j是否已经使用的标志,0为没有使用,*/
                                                /*1为已经使用*/
#define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j)))))    /*第j位上的数字是否已经使用的标志,*/
                                                 /* 0为没有使用,1为已经使用*/
 main()
{ unsigned int number,j; 
  int i;
  printf("\nInput number=");
  scanf("%u",&number); 
  if((number>=MAX)||(number<=1))
   { 
       puts("输入数据错误。\n    1\n");
	getch();
      exit(-1);
   }               /*初始化内存和第一个结果*/ 
 
  _NUM=(unsigned int*)malloc(sizeof(unsigned int)*number); 

  if(!_NUM)
   {
     puts("分配给_NUM出现内存不足");
         exit(-1);
    } 
  _NUMFLAG=(char*)malloc(sizeof(char)*number); 
    if(!_NUMFLAG)
   {
      puts("分配给_NUMFLAG出现内存不足");
     exit(-1);
    }  
     for(i=0;i<(int)number;i++)NUM(i)=i,NUMFLAG(i)=1;  /*初始化第一条结果和使用标志*/ 

    do
    {                        /*主循环*/ 
     
      #ifdef ISPRINT         /*打印结果*/  
      for(j=0;j<number;j++)
          printf("%d ",NUM(j));    /*打印一条结果。*/ 
           puts("");             /*并换行*/  
     #endif    
      NUMUSE(number-1)=0;       /*置最后一位数字的使用标志为0. */  
                                /*在前一个结果中从后往前寻找第一个从小到大排列的数,并存放到变量j中*/  
      for(i=number-2;i>=0;i--)
      {   NUMUSE(i)=0;   
         if(NUM(i)<NUM(i+1))break;  } 
            if(i<0)break;          /*从这里退出主循环.*/  
                for(j=NUM(i)+1;j<number;j++)
                    {   if(!NUMFLAG(j))break; 
                     }  
                  NUMFLAG(j)=1; 
                NUM(i)=j;  
            for(j=0,i++;i<(int)number;j++) 
                  if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1;
       getch();            /*  按一下走一步,可观察详细*/
	}
     while(1);          /*释放内存*/ 
    free(_NUM);
    free(_NUMFLAG);
  }                   /*程序结束*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -