题干
对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有可能的字母组合,如5869,可能代表JTMW、JTMX.................
我的解题思路
刚开始我还以为本题会给我一个多么惊人的答案,结果发现,也只是穷举而已。尽管如此,本题虽然给了伪代码,但是还是比较难看懂,本着“纸上得来终觉浅 绝知此事要躬行”的要义,我决定自己做一遍。实际上刚开始也想了很久,总以为有什么技巧,哪里知道就是穷举而已。
难点就在于事先不知道输入多长的数字,如果只有两位,两个for循环,如果有三位,就三个for循环。但是在不知道的情况下,我设计出了我的解题思路,下面开始说明:
对于数字:23,共有9种可能(根据组合知识可知),如下所示
- ad
- ae
- af
- bd
- be
- bf
- cd
- ce
- cf
对于数字:234,共有下面27种可能,如下所示,
- adg
- adh
- adi
- aeg
- aeh
- aei
- afg
- afh
- afi
- bdg
- bdh
- bdi
- beg
- beh
- bei
- bfg
- bfh
- bfi
- cdg
- cdh
- cdi
- ceg
- ceh
- cei
- cfg
- cfh
- cfi
可以发现,在234中,由左到右的第三列直接,由上到下,只需要按照ghi的顺序一直重复27下,第二列则是3次d,3次e,3次f,而第一列则是9次a、9次b、9次c。这是有规律的。
规律就是:左到右的最后一列,只需要按照其数字代表的字母一直重复就可以了,而倒数第二列,重复的次数则是前一列数字代表的字符的个数,再下一列每个字符重复的次数就是前几列数字代表字符个数的乘积。按照这个规律,我写出了代码,并设计了测试用列。
成功而冗余的版本
#include <stdio.h>
#include <string.h>
void getwords(char *numstr){
int num=atoi(numstr); //把输入的字符转化为int类型
if(num==0||num==1)return; //可以返回一些没有意义一些情况
//初始化的准备
char c[10][10]={
"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl",