Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341417
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:07:20

你怎么有那么多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) |
给主人留下些什么吧!~~