1. 程式人生 > >練習(字串列舉)

練習(字串列舉)

1、字母表∑為  {a b c} ,請列出所有長度小於 5 的字串及個數。

思路:由這個字母表組成的字串大致可分為由1個字母組成的,2個字母組成的,3個字母組成的,4個字母組成的,所以可開四層迴圈進行輸出,相當於賦給字串四個位置,a,b,c存入一個字元組,每層迴圈相當於每個位置有a,b,c三種可能,首先從字元組第一個元素a開始,輸出一個字母a組成的字串,然後輸出兩個字母a組成的......以此類推,直到輸出所有以a打頭的組合,然後輸出以b開頭的...,以此類推,直到輸出每種字串的全排列組合。程式碼和執行結果如下:

#include<stdio.h>
#include<math.h>
int main()
{
	char ch[3]={'a','b','c'};//把a,b,c存入一個字元組
	int sum = 0,i,j,k,m;
	for (i=0;i<3;i++)
	{
		printf("%c ",ch[i]);//輸出一個字母組成的字串
		sum ++ ;
		for (j=0;j<3;j++)
		{
			printf("%c%c ",ch[i],ch[j]);//輸出兩個字母組成的字串
			sum ++ ;
			for (k=0;k<3;k++)
			{
				printf("%c%c%c ",ch[i],ch[j],ch[k]);//三個字母組成的字串
				sum ++ ;
				for (m=0;m<3;m++)
				{
					printf("%c%c%c%c\n",ch[i],ch[j],ch[k],ch[m]);//四個字母組成的字串
					sum ++ ;			
				}
			}
		}
	}
	printf("共有%d個組合的字串\n",sum);
}

2. 若字母表中字元個數為m(m>=1),具體字元通過輸入確定,請列出長度小於n的字串及個數。

思路:同上,但由於字串最大長度不固定,所以設定長度引數,運用遞迴代替1問中的迴圈,程式碼及結果如下:

#include<stdio.h>
#include<iostream>
using namespace std;
int n,m,sum;
char ch[40],str[300];
void st(int x)
{
	if (x==-1) //所有組合排列完畢,結束
	{
		return ;
	}
	for (int i=0;i<m;i++)
	{
		str[x] = ch[i];
		cout<<(str+x)<<endl;
		sum++;		
		st(x-1);
	}
}
int main()
{
	printf("請輸入字元表中字元的個數:");
	scanf("%d",&m);
	printf("請輸入各字元:");
	for(int i=0;i<m;i++)
	cin>>ch[i];
	printf("請輸入生成的字串小於的長度:");
	scanf("%d",&n);
	n--;
	str[n]=0;
	sum=0;
	st(n-1);
	printf("共有%d個組合的字串\n",sum);
}