練習(字串列舉)
阿新 • • 發佈:2019-01-05
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); }