迅雷笔试题_实现全排列

 

题目:
用C ++ 写一个函数, 如 Foo( const   char   * str), 打印出 str 的全排列, 
如 abc 的全排列: abc, acb, bca, dac, cab, cba

wanfustudio(雁南飞:知识之败,慕虚名不务潜修也) 给出的源码:

  void  chang( char  str[], int  m)  
/*定义循环左移函数(我没有用左移函数)*/
{
  
int i,j;
  
char temp=str[0];
  
for (i=0;i<m;i++) str[i]=str[i+1];
  str[i]
=temp;
}

void  pai( char  str[], int  m, int  n)  /*定义全排列函数*/
{
int k;
void chang(char str[],int m);
if (m<n)        /* 定 义 递 归 调 用 出 口  */
  
{
   
for (k=0;k<=m;k++)
    
{
     pai(str,m
+1,n); /*递归调用*/
     chang(str,m); 
/*调用左移函数*/
    }

  }

else printf("%s ",str); 
}

#include 
" stdio.h "
main()
{char str[]="ABCD"
/*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
clrscr();
pai(str,
0,4); 
/*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/
getch();
}

/*********************************************/

但在用VC++调试上面这段源码时会发现少量errors和warnings,下面是我调试后的源码,有些自己不知道有什么用的代码就隐去了。

// 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, 
// 如 abc 的全排列: abc, acb, bca, dac, cab, cba
#include  " stdio.h "

void  chang( char  str[], int  m)  
/*定义循环左移函数(我没有用左移函数)*/
{
  
int i;
  
char temp=str[0];
  
for (i=0;i<m;i++) str[i]=str[i+1];
  str[i]
=temp;
}


void  pai( char  str[], int  m, int  n)  /*定义全排列函数*/
{
int k;
void chang(char str[],int m);
if (m<n)        /* 定 义 递 归 调 用 出 口  */
  
{
   
for (k=0;k<=m;k++)
    
{
     pai(str,m
+1,n); /*递归调用*/
     chang(str,m); 
/*调用左移函数*/
    }

  }

else printf("%s ",str); 
}


void  main()
{char str[]="ABC"
/*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
//clrscr();
pai(str,0,3); 
/*这里参数0(下标)表示从第一个元素开始,3表示元素个数(不是下标)*/
//getchar();
}

/*********************************************/

 这是给pcboyxhy(-273.15℃) 出的一个源码:

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

char  used[ 20 ] = {0} ;
int  number[ 20 ], len, i, p[ 20 ];

void  output()
{
    printf(
" ");
    
for(i=0; i<len; ++i)
        printf(
"%d ", number[p[i]]);
}


int  pailie( int  n)
{
    
int ii;
    
if(n==len)
        output( );

    
for(ii=0; ii<len; ++ii)
        
if(!used[ii]){
            used[ii] 
= 1;
            p[n] 
= ii;
            pailie(n
+1);
            used[ii] 
= 0;
        }

    
return 0;
}


int  main( int  argc,  char   * argv[])
{
    
int index = 0;
    scanf(
"%d"&len);
    
while(index<len)
    scanf(
"%d"&number[index++]);
    pailie(
0);
    
return 0;
}

但只对数字起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值