1.求组合数: 求n个数(1....n)中k个数的组合....
如:combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,321,
/*
求组合数: 求n个数(1....n)中k个数的组合....
如:combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,321,
*/
#include
#include
int pop(int *);
int push(int );
void combination(int ,int);
int stack[3]={0};
int top = -1;
int main()
{
int n,m;
n = 5;
m = 3;
combination(n,m);
printf("\n");
}
void combination(int m,int n)
{
int temp = m;
push(temp);
while(1)
{
if(1==temp)
{
if(pop(&temp) && stack[0]==n)
break;
}
else if(push(--temp))
{
printf("%d%d%d\n",stack[0],stack[1],stack[2]);
pop(&temp);
}
}
}
int push(int i)
{
stack[++top]=i;
if(top<2)
return 0;
else
return 1;
}
int pop(int *i)
{
*i = stack[top--];
if(top>=0)
return 0;
else
return 1;
}
2.、用指针的方法,将字符串“ABCD1234efgh”前后对调显示
#include
#include
int main()
{
char str[]="ABCD123efgh";
int length = strlen(str);
char *p1= str;
char *p2 = str+length -1;
while(p1
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("str now is %s\n",str);
return 1;
}
3.给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"
#include
#include
#include
char *commanstring(char shortstring[],char longstring[])
{
int i,j;
char *substring = malloc(256);
if(strstr(longstring,shortstring)!=NULL)
return shortstring;
for(i=strlen(shortstring)-1;i>0;i--)
{
for(j=0;j<=strlen(shortstring)-i;j++)
{
memcpy(substring,&shortstring[j],i);
substring[i]='\0';
if(strstr(longstring,substring)!=NULL)
return substring;
}
}
return NULL;
}
void main(void)
{
char *str1 = "aocdfe";
char *str2 = "pmcdfa";
char *comman = NULL;
if(strlen(str1)>strlen(str2))
comman= commanstring(str2,str1);
else
comman = commanstring(str1,str2);
printf("the longest comman string is:%s\n",comman);
}