题目描述
电话的号码盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。
对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTB······
1) 设计程序,尽可能从这些字母组合中,找到一个有意义的单词来表述一个电话号码。如单词"computer"来描述号码26678837。
2) 对于一个号码,是否可以用一个单词代表?怎样才是最快的方法?
解法一:直接循环法
解法二:递归法
#include<iostream> #include<stdio.h> using namespace std; int number[100]; char c[10][10]={ "", //0 "", //1 "ABC", //2 "DEF", //3 "GHI", //4 "JKL", //5 "MNO", //6 "PQRS", //7 "TUV", //8 "WXYZ", //9 }; int total[10]={0,0,3,3,3,3,3,4,3,4};//每个数字代表的字符数 int answer[10];//电话号码 void compute(int length) { int k; while(true) { k=length-1; for(int i=0;i<length;i++) cout<<c[number[i]][answer[i]]<<" ";//输出每个号码的第一个字符, cout<<endl; while(k>=0) { if(answer[k]<total[number[k]]-1) { answer[k]++; break; } else { answer[k]=0; k--; } } if(k<0) break; } } void recursion(int length,int index) { if(index==length) { for(int i=0;i<length;i++) cout<<c[number[i]][answer[i]]<<" "; cout<<endl; return ; } for(answer[index]=0;answer[index]<total[number[index]];answer[index]++) recursion(length,index+1); } int main() { int length=3; number[0]=2; number[1]=3; number[2]=4; printf("method 1:\n"); compute(length); printf("method 2:\n"); recursion(length,0); return 0; }