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 <stdio.h>
#include <error.h>
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 <stdio.h>
#include <string.h>
int main()
{
  char str[]="ABCD123efgh";
  int length = strlen(str);
  char *p1= str;
  char *p2 = str+length -1;
  while(p1<p2)
  {
    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 <stdio.h>
#include <stdlib.h>
#include <string.h>

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);
  
 }