你怎么有那么多C的程序呢,刚才是猜数,现在是这个。
这个牵扯到全排列的算法,我把排列的算法给你,你自己参考一下吧。
#include
#include
#include
#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为已
经使用*/
void main()
{
unsigned int number,j;
int i;
printf("\nInput number=");scanf("%u",&number);
if((number>=MAX)||(number<=1)){puts("输入数据错误。");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
do{/*主循环*/
#ifdef ISPRINT/*打印结果*/
for(j=0;j puts("");/*并换行*/
#endif
NUMUSE(number-1)=0;//置最后一位数字的使用标志为0.
/*在前一个结果中从后往前寻找第一个从小到大排列的数,并存放到变量j中*/
for(i=number-2;i>=0;i--){
NUMUSE(i)=0;
if(NUM(i) }
if(i<0)break;/*从这里退出主循环.*/
for(j=NUM(i)+1;j if(!NUMFLAG(j))break;
}
NUMFLAG(j)=1;
NUM(i)=j;
for(j=0,i++;i if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1;
}while(1);
/*释放内存*/
free(_NUM);
free(_NUMFLAG);
system("Pause");
}
--------------------next---------------------
阅读(1027) | 评论(0) | 转发(0) |