问题描述
输入字母的个数m,确定字母(从a开始)如输入4,则有a,b,c,d四个字母。编程打印出由这些字母组成的长度为n的所有可能的字符串。例如m=3,则有字母a,b,c。n=2则输出
aa ab ac ba bb bc ca cb cc
分析
我们可以将题目进行抽象,在有放回的前提下,求全部从m个不同的元素中任取n个元素的排列。根据题目的含义,我们可以用整数0~m-1表示这m个不同的元素,将要生成的n个元素分成两部分:第一个元素和其他n-1个元素。如果n=1,即要从m个元素中任取1种,这样有m种不同的取法,我们可以直接使用循环完成。若n>1,则可以知道第一个元素有m种不同的取法,可以针对第一个元素m种不同取法的1种,对后面的n-1个元素进行同样的递归操作即可产生一种新的不同排列。具体算法描述如下:
fun(指向第一个元素的指针,从m个元素中,取n个元素)
{
for(i=0;i < m;i++)
{ 确定第一个元素的选取方法:=i;
if(n > 1) fun(指向下一个元素的指针,从m中,取n-1个) else 完成一种排列
}
}
代码实现
#include <stdio.h>
int str[100];
void print(int *p)
{
int *q;
for(q=str;q!=p+1;q++)
{
printf("%c",*q+'a');/*输出结果,将整数转换为字母a起始的序列*/
}
putchar(' ');
}//print
void arrange(int *p,int m,int n)/* 从m个元素中取n个存入数组p中*/
{
int i; /*用数0~m-1表示m个不同的元素*/
for(i=0;i<m;i++) /*依次从数0开始逐个作为第一个元素*/
{
*p=i;
if(n>1)
{
arrange(p+1,m,n-1);
}
else print(p);
}
}//arrange
int main()
{
int m,n;
scanf("%d%d",&m,&n);
while(n>m)
{
printf("\nEnter error,please enter again(m>=n)\n");
scanf("%d%d",&m,&n);
}
arrange(str,m,n);//递归调用
putchar('\n');
return 0;
}//main