经典代码拾遗

时间:2023-01-12 23:43:46

 组合问题(递归)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void find(char *source, char *result, int n)
{
if(n==1)
{
while(*source)
printf("%s%c\n", result, *source++);
}
else
{
int i, j;
for(i=0; source[i] != 0; i++);
for(j=0; result[j] != 0; j++);
for(; i>=n; i--)
{
result[j] = *source++;
result[j+1] = '\0';
find(source, result, n-1);
}
}
}

int main(int argc, char* argv[])
{
int const n = 3;
char *source = "ABCDEk", result[n+1] = {0};
if(n>0 && strlen(source)>0 && n<=strlen(source))
find(source, result, 3);
return getchar();
}

//http://faq.csdn.net/read/191186.html 组合问题 算法

全排列(非递归)

#include<stdio.h>/*这两个库函数是习惯性的加上去的^_^。*/
#include<stdlib.h>
#include <time.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为已 经使用*/

void main()
{
int t1 = clock();
unsigned int number,j;
int i;
printf("Input number=8");
number = 8;
//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<number;i++)
{
NUM(i)=i;
NUMFLAG(i)=1;
}/*初始化第一条结果和使用标志*/
int k;
for(k=0;k<number;k++)printf("%d ",NUMFLAG(k));
puts("");
do/*主循环*/
{
#ifdef ISPRINT/*打印结果*/
for(j=0;j<number;j++)printf("%d ",NUM(j));/*打印一条结果。*/
puts("");/*并换行*/
#endif

NUMUSE(number-1)=0;//置最后一位数字的使用标志为0.
for(k=0;k<number;k++)printf("%d ",NUMFLAG(k));
puts("");
/*在前一个结果中从后往前寻找第一个从小到大排列的数,并存放到变量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<number;j++)
{
if(!NUMFLAG(j))
{
NUM(i++)=j;
NUMFLAG(j)=1;
}
}
}while(1);
/*释放内存*/
free(_NUM);
free(_NUMFLAG);
printf("用时%dms/n",clock()-t1);
getchar();
}