编程之美 3.2 :电话号码对应的英文单词

题干

对如非全键盘的手机上的数字,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,要求对一段数字,输出其代表的所有可能的字母组合,如5869,可能代表JTMW、JTMX.................

我的解题思路

刚开始我还以为本题会给我一个多么惊人的答案,结果发现,也只是穷举而已。尽管如此,本题虽然给了伪代码,但是还是比较难看懂,本着“纸上得来终觉浅 绝知此事要躬行”的要义,我决定自己做一遍。实际上刚开始也想了很久,总以为有什么技巧,哪里知道就是穷举而已。

难点就在于事先不知道输入多长的数字,如果只有两位,两个for循环,如果有三位,就三个for循环。但是在不知道的情况下,我设计出了我的解题思路,下面开始说明:

对于数字:23,共有9种可能(根据组合知识可知),如下所示

  1. ad
  2. ae
  3. af
  4. bd
  5. be
  6. bf
  7. cd
  8. ce
  9. cf

对于数字:234,共有下面27种可能,如下所示,

  1. adg
  2. adh
  3. adi
  4. aeg
  5. aeh
  6. aei
  7. afg
  8. afh
  9. afi
  10. bdg
  11. bdh
  12. bdi
  13. beg
  14. beh
  15. bei
  16. bfg
  17. bfh
  18. bfi
  19. cdg
  20. cdh
  21. cdi
  22. ceg
  23. ceh
  24. cei
  25. cfg
  26. cfh
  27. 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",  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值