📄 quanpailie.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 + -